Merkwürdiges Verhalten beim Durchlaufen einer List per Iterator



  • 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.



  • sunnyandy schrieb:

    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.

    Container sind die STL-Dinger, die Du benutzt. Also list, vector, deque usw.
    Du scheinst die Größe für Dein Vektor/Listen-Objekt aus einer uninitialisierten Variable zu holen.
    Einfaches Beispiel

    size_t size; //size wurde nicht initialisiert. Es steht irgendwas drin, von 0 bis 2^size_t-Bits
    std::vector<int> vec(size); //legt einen vektor an. Die Größe kann alles mögliche sein.
    

Anmelden zum Antworten