Merkwürdiges Verhalten beim Durchlaufen einer List per Iterator
-
Dravere schrieb:
Zu deinem Problem, zeig mal etwas mehr Code. So viel kann ja nicht passieren in der while-Schleife.
Grüssli
Wenn die Liste leer ist, passiert gar nichts, weil er gar nicht in die Schleife rein gehen sollte.
-
[quote="Dravere"]
Tachyon schrieb:
Zu deinem Problem, zeig mal etwas mehr Code. So viel kann ja nicht passieren in der while-Schleife.
GrüssliAufgrund des Fehlers habe ich mittlerweile alles auskommentiert. In der while-Schleife passiert nicht mehr.
Irgendwie scheint er die Liste nicht richtig zu erzeugen...
-
Was für einen Compiler benutzt Du denn?
Schmeiss mal das
#include "Observer.h"raus und ersetzte es durchstruct Observer{};.PS: Natürlich nur zum Testen.

-
Tachyon schrieb:
Wenn die Liste leer ist, passiert gar nichts, weil er gar nicht in die Schleife rein gehen sollte.
a) Die Liste ist nicht leer. Sonst würde die Endlosschleife nicht starten!
b) Eine Endlosschleife kann dann nur dadurch passieren, dass in der While-Schleife ein Problem ist.
c) Dass die Liste Elemente aufweist, obwohl sie leer sein sollte, ist natürlich noch ein weiteres Problem, auf welches ich aber erst als zweites geschaut hätte
Grüssli
-
Hallo,
ich konnte es leider nicht durch ein struct ersetzen, da der Compiler gemeckert hat, dass der Name bereits an anderer Stelle als Klasse auftaucht.
Ich habe die Header-Datei "Observer.h" rausgeschmissen, die
List<Observer*> in
List<int*>
umgewandelt (Zum Testen) und habe immer noch das gleiche Problem.ich benutze den GNU g++
-
Ich glaube eher, dass er nicht die Liste benutzt, von der er denkt, dass er sie benutzt.

-
Tachyon schrieb:
Ich glaube eher, dass er nicht die Liste benutzt, von der er denkt, dass er sie benutzt.

Zeige mal den Code für die int* Liste.
-
OK, mittlerweile sieht es so aus (Hatte aus der Liste vorhin Pointer gemacht).
#ifndef _OBSERVABLE_H #define _OBSERVABLE_H #include <iostream> #include <list> class Observable { private: std::list<int*> *observers; protected: Observable() { observers = new std::list<int*>; } public: void notify(void *obj) { std::list<int*>::iterator iter = observers->begin(); int i = 0; while (iter != observers->end()) { std::cout << "OOO_ESTI " << i++ << std::endl; iter++; } } }; #endif
-
Wie legst Du denn Observable-Objekte an, wenn der Ctor protected ist?
Falls Du von dem Ding erbst:
Probier Observable.notify() lieber erstmal direkt in der main aus, ohne über die erbende Klasse zu gehen.
-
Tachyon schrieb:
Wie legst Du denn Observable-Objekte an, wenn der Ctor protected ist?
Falls Du von dem Ding erbst:
Probier Observable.notify() lieber erstmal direkt in der main aus, ohne über die erbende Klasse zu gehen.Genau, ich geh momentan über die erbende Klasse. Ich habe die header-Datei in einem einfachen Testprogramm eingebunden und dort hat es eben funktioniert (aus der main aufgerufen, wie du es sagst).
Wenn ich hier die Anzahl der Elemente ausgeben will, kommt das Programm zum Stillstand (das ist merkwürdig, oder?):
while (iter != observers->end()) { std::cout << "OOO_ESTI " << observers->size() << std::endl; iter++; }Der Konstruktor der Klasse, die von Observable erbt, sieht so aus:
MapModel::MapModel(): Observable(){ }Das habe ich doch richtig gemacht, oder?
-
Wie wird denn notify in der erbenden Klasse aufgerufen?
-
Die wird folgendermaßen aufgerufen:
void MapModel::loadMapFile(char *filename) { ... notify(NULL); }
-
Und MapModel hat nicht zufällig noch ein eigenes notify? Ich würde mal einen Debugger bemühen und gucken, was da genau aufgerufen wird.
-
Wie kann ich denn in C++ explizit eine Methode der Oberklasse aufrufen?
Sowas wie "inherited notify" in Delphi z.B. (Geht das überhaupt aufgrund der Mehrfachvererbung?)
-
sunnyandy schrieb:
Wie kann ich denn in C++ explizit eine Methode der Oberklasse aufrufen?
Sowas wie "inherited notify" in Delphi z.B. (Geht das überhaupt aufgrund der Mehrfachvererbung?)So:
struct Base { void function(){} }; struct Derived : Base { void function(){} }; Derived derivedObject; derivedObject.Base::function();
-
Hmm, es hat leider keine Wirkung gezeigt

ich schätze, es stimmt irgendwas mit dem Listenobjekt nicht. Welche Listentypen kann ich denn noch benutzen außer std::list ?
-
Ich habe das gleiche nun mit einem Vector von int-Objekten probiert,
und nun gibt er aus, dass sich 4294906818 Elemente im Vector befinden, obwohl ich sie dort nicht reingetan habe...
-
Das sieht schwer nach einer Index oder Grenzüberschreitung aus...kann es sein dsa du irgendwo drüber iterierst ?
-
Gehe mit 'nem Debugger durch den Code. Ich bin mir sehr sicher, dass Du Deinen Container irgendwo zerbügelst.
Mit dem Code, den Du hier reingestellt hast, kann man nicht mehr sagen.
-
Tachyon schrieb:
Gehe mit 'nem Debugger durch den Code. Ich bin mir sehr sicher, dass Du Deinen Container irgendwo zerbügelst.
Mit dem Code, den Du hier reingestellt hast, kann man nicht mehr sagen.Was heißt Container? Wie kann sowas passieren?
Ich danke euch trotzdem für die tolle Hilfe! Dankeschön!
Ich kann mir auch die Zahlen ausgeben lassen, die sich im Vector befinden, sie kommen wie nach dem Zufallsprinzip heraus.