Kai A. schrieb:
> Ich verstehe nicht warum Beispiel 1 nicht funktioniert. Wie funktioiert
> auto?
>
> Beispiel 1: for (auto it_NLevel : NLevel)
> {
> it_NLevel->setTlevel(20.0);
> it_NLevel->setTconv(0.0);
> it_NLevel->setHeight(CalculateLevelHeight());
> it_NLevel->setVolume(CalculateLevelVolume());
> }
>
> Beispiel 2:
> for (auto& it_NLevel : NLevel)
> {
> it_NLevel.setTlevel(20.0);
> it_NLevel.setTconv(0.0);
> it_NLevel.setHeight(CalculateLevelHeight());
> it_NLevel.setVolume(CalculateLevelVolume());
> }
Lassen wir erst mal 'auto' aus dem Spiel. Dann würdest du so schreiben
müssen, damit es funktioniert (ich lass das 'it_' mal weg, weil das ist
schon die nächste Verwirrung):
1 | for (Level& l : NLevel)
|
2 | {
|
3 | l.setTlevel(20.0);
|
4 | //...
|
5 | }
|
Die Variable 'l' ist hier nicht ein Iterator, der auf ein Element zeigt,
sondern wird für jeden Schleifendurchlauf mit dem Element des Containers
Nlevel initialisiert. Im Hintergrund wird tatsächlich ein Iterator
dereferenziert.
Jetzt willst du beim Initialisieren ja, dass du die Elemente im Vektor
beschreibst. Daher darf die Initialisierung von 'l' für den aktuellen
Schleifendurchlauf nicht eine Kopie erzeugen. Daher deklarieren wir 'l'
als Referenz (das '&' davor). Dadurch wirkt der 'setTlevel'-Aufruf auf
das Element im Container, und nicht auf eine Kopie davon.
Würdest du jetzt schreiben:
1 | for (Level l : NLevel)
|
2 | {
|
3 | l.setTlevel(20.0);
|
4 | //...
|
5 | }
|
(ohne Referenz), dann wird 'l' immer mit einer Kopie des
Container-Elements initialisiert, und 'setTlevel' wirkt auf die Kopie
und nicht auf das Element im Container.
Schreibst du jetzt aber sogar
1 | for (Level l : NLevel)
|
2 | {
|
3 | l->setTlevel(20.0);
|
4 | //...
|
5 | }
|
dann mault der Compiler, weil der Typ 'Level' kein Pointer ist und auch
keinen operator-> definiert hat.
Das hat bisher alles nichts mit 'auto' zu tun, und 'auto' ändert auch
nichts an den Fehlersituationen. In deinen beiden Beispielen bewirkt es
nur, dass der Compiler sich den Typ der Container-Elemente ('Level')
selbst ausrechnen soll.