Objekt mit Nachfolge Objekt (Zeiger)



  • Hallo,

    ich habe folgendes Problem:
    ich habe eine Klasse (element) von der verschiedene andere Klassen abgeleitet werden. (element1, element2 z.bsp.)

    jetzt sollen diese Elemente aneinandergereiht werden und dazu habe ich mir folgendes ausgedacht:
    in element (also der abstracten grundklasse) steht eine membervariable die einen zeiger auf das nächste objekt beinhalten soll.

    Wenn diese jetzt so deklariert ist:

    element* nextElement
    

    , kann ich dann diesen Zeiger auch auf derivate von element zeigen lassen?
    Oder soll ich einen

    void* nextElement
    

    nehmen?

    Weiterhin habe ich dann eine

    element* getNextElement()
    

    funktion die mir den Zeiger auf das nächste element gibt, nur wie krieg ich jetzt das Objekt zu dem Zeiger?
    derzeit habe ich das so gelöst, ist aber sehr umständlich:

    element myEle = new element();
    	element myEle2 = new element();
    	myEle2.setColorRed(189);
    	myEle.setNextElement(&myEle2);
    	element* bla = myEle.getNextElement();
    	element bla2 = *bla;
    	cout << bla2.getColorRed() << endl;
    

    Wie komme ich direkter an das getColorRed() von myEle2 über myEle ran? weil so find ich das ein wenig umständlich...

    Ich hoffe das war verständlich was ich da zusammengewurschtelt habe 🙂
    Danke fürs durchlesen 🙂

    lG Jan



  • nimm am besten verkettete listen aus der stl: std::list

    und dazu dann noch virtuelle Funktionen.
    Das Funktioniert so: die Funktionen aus element (Basisklasse) werden mit einem virtual versehen, die in den ableitungen (element1, element2) neu definiert werden sollen.
    Dann ist es egal von welchem typ die zeiger sind, es wird immer die richtige funktion aufgerufen



  • Ich versuch das jetzt grade so:

    element e1 = new element();
    	e1.setColorRed(1);
    	element e2 = new element();
    	e2.setColorRed(2);
    	element e3 = new element();
    	e3.setColorRed(3);
    
    	std::list<element> elelist;
    
    	elelist.push_back(e1);
    	elelist.push_back(e2);
    	elelist.push_back(e3);
    	cout << elelist.begin().getColorRed();
    

    jetzt krieg ich aber komischer weise diesen Fehler:

    g++ -c `wx-config --cxxflags` ../src/main.cpp
    ../src/main.cpp: In constructor »MyFrame::MyFrame(wxFrame*, const wxString&)«:
    ../src/main.cpp:56: Fehler: »list« ist kein Element von »std«
    ../src/main.cpp:56: Fehler: expected primary-expression before »>« token
    ../src/main.cpp:56: Fehler: »elelist« wurde in diesem Gültigkeitsbereich nicht definiert
    make: *** [main.o] Fehler 1

    Was is da los? überall steht std::list ... warum gibts das jetzt nicht? oO



  • 1. #include <list>
    2. std::list<element*> elelist;
    3. wo ein new ist, soll auch ein delete sein.
    4. Zugriff erfolgt über Iteratoren:
    std::list<element*>::const_iterator it = elelist.begin();
    element* e = *it;
    std::cout << e->getColorRed();

    (Ist ein wenig aufwändig geschrieben, kannst Du auch abkürzen.

    Simon

    Edit:
    Übrigens muss auch e1->setColorRed(1); anstelle vone1.setColorRed(1); stehen.


Anmelden zum Antworten