Verwendung eines Containers



  • Hallo hier im Forum,
    (ich bin neu hier, und auch in c++ ein blutiger Anfaenger)

    Ich habe einen Testcase angehaengt, der mein Problem isoliert:
    Eine class "L" sollte mit der Methode L::add(T &t) Instanzen einer Klasse "AT" erzeugen, die auf "t" referenzieren, und ausserdem in einen Container aTList_ pushen.

    Die Methode L::getDP() sollte dann durch diesen Container iterieren, und genau das funktioniert nicht - bzw. produziert ein Zufallsergebnis wie mir scheint.

    Nach fast 2 Tagen vergeblicher Fehlersuche muss ich euch fragen:
    Was ist, wahrscheinlich in l.cpp falsch?

    vielen Dank

    class L {
    public:
    L();
    L& add(T& t);
    void getDP();
    private:
    std::list< AT* > aTList_;
    };

    ################################
    l.cpp:

    #include <iostream>
    #include <list>
    #include "l.h"
    using namespace std;

    L::L(){}

    L& L::add(T &t){
    AT at(t, true);
    aTList_.push_back(&at);
    return *this;
    }

    void L::getDP(){
    std::list< AT* >::iterator it = aTList_.begin();
    for( ; it != aTList_.end();++it) {
    AT* at = *it;
    cout << at->getD() << endl;
    }
    }

    ################################
    at.h:
    class T;
    class AT {
    public:
    AT(T& t, bool d) : t_(t), d_(d){}
    bool getD();
    T& getT();
    private:
    T& t_;
    bool d_;
    };

    ################################
    at.cpp:
    #include "at.h"

    bool AT::getD(){ return d_;}
    T& AT::getT() { return t_;}

    ################################
    t.h:
    class T {
    public:
    T(int i) : i_(i){}
    int getI();
    private:
    int i_;
    };

    ################################
    t.cpp:
    #include "t.h"
    int T::getI() {return i_;}

    ################################
    main.cpp:
    #include "t.h"
    #include "l.h"
    #include <iostream>
    using namespace std;

    int main(int argc, char *argv[])
    {
    int a = 4;
    T it(a);
    L il;
    il.add(it);
    il.getDP();
    }



  • code tags oder niemad liest es sich durch.

    edit: [code="cpp"][/code]



  • AT at(t, true);
    aTList_.push_back(&at);
    

    Du fügst die Adresse von at in die Liste ein. at ist ein temporäres Objekt, was beim Verlassen der Funktion zerstört wird.
    BTW: Ernsthaft? Du nennst deine Klassen T, AT und L?!



  • @Nathan,
    ahhhhhhh ich verstehe!
    Ich muss also die Liste mit
    aTList_.push_back(at);
    fuellen.

    Ich glaube das ist die Loesung!!

    (Nein, die class-names sind Loop, AnnotatedTransformer, Transformer. Ich hab's
    nur in diesem testcase L, AT, T genannt)

    vielen Dank nochmal!
    kwurpi



  • kwurpi schrieb:

    @Nathan,
    ahhhhhhh ich verstehe!
    Ich muss also die Liste mit
    aTList_.push_back(at);
    fuellen.

    Ich glaube das ist die Loesung!!

    Nicht ganz, dann fügst du ja keinen Pointer ein, sondern ein AT Objekt.
    Du musst also entweder dafür sorgen, dass der Pointer gültig bleibt (schlechtere Idee) oder direkt AT Objekte speichern (bessere Idee).



  • Ich werde die AT objects direkt in die Liste nehmen. Die AT selber referenzieren die T, und das ist genau was ich will.
    Ich kann kaum beschreiben wie hilfreich deine paar Zeilen waren!
    Danke!


Anmelden zum Antworten