child-classes in vector speichern?

Code:
CSceneMan::~CSceneMan(void)
{
	for(GLuint x=sqrt(GLuint((scene.size()*scene.size)) - sin(90)); x>=NULL; x-1) {
		delete scene[x];
	}
}

Watn das?

Sollte das nicht heißen x = x-1 ansonsten isses dasselbe wie meins nur etwas
komplexer ausgedrückt... :)

Ich meinte nat. das der index eines Vectors bei 0 anfängt und bei n-1 aufhört


Gruß

RedWing
 
Jo!
Aber sollte meine Variante nicht die selbe Lösung bieten?
oder hätte es, um richtig zu sein so aussehen müssen:
Code:
CSceneMan::~CSceneMan(void) { 
                       for(GLuint x=(GLuint)scene.size(); x>0; --x) { 
                                       delete scene[x]; 
                       } 
}
...da vertu ich mich immer ;-)
 
TeCe hat gesagt.:
Jo!
Aber sollte meine Variante nicht die selbe Lösung bieten?
oder hätte es, um richtig zu sein so aussehen müssen:
Code:
CSceneMan::~CSceneMan(void) { 
                       for(GLuint x=(GLuint)scene.size(); x>0; --x) { 
                                       delete scene[x]; 
                       } 
}
...da vertu ich mich immer ;-)

Mit Predecrement isses nat. richtig ;)

Gruß

ReddWing
 
Bitte?!

Der Invarianz-Teil einer for-Schleife wird doch immer nur nach der Schleife (/edit: sprich: nach dem Anweisungsblock) ausgeführt, der Rückgabewert wird verworfen. Das heißt es ist völlig egal ob Prä- oder Postdekrement. Der Code ist falsch.

Wenn dein Vektor z.B. 1 Element hat, greifst du fröhlich auf x[1] drauf zu, bevor dann (prä-)dekrementiert wird.
 
Zuletzt bearbeitet:
what what whaaaat?

(PRÄ)dekrement sagt doch eigentlich schon alles aus, oder?
so würde doch bei einem Element von scene.size() = 1 zurückgeliefert, entsprechend in der for-schleife das 1--te Element aus dem vector deleted...?
 
Die Indizierung bei Arrays und Vektoren in C bzw. C++ beginnt bei 0 nicht bei 1!

Wenn dein Vektor/Array also 1 Element hat, dann darfst du auf dieses Element mit
a[0] drauf zugreifen.
 
Deepthroat hat natürlich vollkommend recht, kaum zu toppen :)

Wenn dus gleich so machst mit 0 anzufangen und bei n-1 aufhörst und postincrement verwendest passiert sowas nat. nicht :)

Gruß

RedWing
 
öh äh...stell ich mich jetz wirklich so blöd an?

Code:
scene.add(sc1);// size()=1
scene.add(sc2);// size()=2

for(unsigned int x=scene.size()/*=2*/; x>0/*wenigstens 1*/; --x/*1 weniger*/) {
   delete scene[x];/*erster Durchlauf scene.size()-x=2-1=1   : scene[1]
                           *zweiter Durchlauf scene.size()-x=2-2=0 : scene[0]
                          */
}
 
Code:
for(unsigned int x=scene.size()/*=2*/; x>0/*wenigstens 1*/; --x/wird erst nach der Schleife dekrementiert und beim letzten schleifen durchlauf gar nicht mehr weil die schleife vorher schon abgebrochen wird...*/) {
   delete scene[x];/*erster Durchlauf scene.size()=2-1=1   : scene[1]
                           *zweiter Durchlauf scene.size()=2-2=0 : scene[0]
                          */
}

Machs doch einfach so:
Code:
for(unsigned int x=0;  x<scenes.size(); x++) {
   delete scene[x];

dann passiert dir sowas auch nicht...

Gruß

RedWing
 
OK. Also ganz langsam. Der Ablauf für dein Beispiel sieht aufgedröselt folgendermaßen aus:

Code:
1) unsigned int x= 2
2) x > 0  (ist 2 größer als 0) Ja.
3) delete scene[2] /* Fehler! in scene gibt es nur 2 Elemente, scene[0], scene[1]
4) --x  /* Hier erst wird dekrementiert */
5) x > 0 (ist 1 größer als 0) Ja.
6) delete scene[1] /* diesmal OK. */
7) --x
8) x > 0 (ist 0 größer als 0) Nein. => Ende. (allerdings ist scene[0] nicht gelöscht.)

Es wird also erst die Initialisierung ausgewertet. Dann wird geprüft ob die Schleifenbedingung war ist. Wenn ja, wird die Schleife durchlaufen. Und erst dann wird die Invarianz-Anweisung der Schleife ausgführt.

/edit:
Ach ja, und ob nun Prä- oder Postdekrement ist wirklich egal, denn das hat ja nur eine Auswirkung auf das Ergebnis der Operation, nicht darauf wann es ausgeführt wird.
Code:
x = 5; --x; /* Ergebnis ist 4 */
x = 5; x--; /* Ergebnis ist 5 */

/* das Resultat für die Variable x ist immer gleich: ihr Wert ist 4. */
 
Zuletzt bearbeitet:
Zurück