Brauche hilfe bei listen/iteratoren/übergaben



  • Hi, ich bin relativ neu, also sorry falls etwas von Anfang an falsch ist .)

    Ich habe 3 Klassen:
    Klasse A: Enthält eine Liste an Polygone (Kleine Klasse mit 3 doubles)
    Klasse B: Enthält eine Liste an Klasse A-Instanzen.
    Klasse C: Hier stehen die Draw-Routinen drin.

    In Klasse A und B navigiere ich durch die Listen per Iteratoren.
    Ich möchte aus Klasse C heraus auf die 3 doubles der Polygone zugreifen ohne irgendetwas umzukopieren also nur mit Pointer (oder Referenzen).

    Ich habe eine folgende Funktion in Klasse B um eine Instanz der Klasse A zurückzugeben (alles stark vereinfacht):

    const KlasseA& KlasseB::getKlasseA(int tmp)  //int = "ID" des KlasseA
    {
      list<KlasseA>::iterator from;
      from = sollist.begin();
      for (int i=0; i<tmp; i++) from++;
      return *from;
    }
    

    Ich versuche nun in Klasse C diese zurückgelieferten Objekte zu nutzen, aber bekomme das nur durch Kopieren der Klasse A hin :

    void KlasseC::trisize()              
    {
    int i = 3;
    KlasseA tmpsol = klassebinst.getKlasseA(i);
    tmpsol.TueEtwas();  
    }
    

    klassebinst = KlasseBInstanz
    Wie müsste der Zugriff in KlasseC aussehen um einen Pointer oder Referenz auf eine Instanz der Klasse A zu erhalten?

    Ich habe Ausdrücke wie
    const KlasseA *tmp = &klassebinst.getKlasseA(i);
    oder
    const KlasseA *tmp = &(*klassebinst.getKlasseA(i));
    aber überall nur Fehlermeldungen. (bzw Fehlermeldungen beim Zugreifen auf Funtionen von tmp).
    Ich versuche nur in KlasseC die Elemente der Liste aus KlasseB zu nutzen.
    Ich hoffe einer kann mir Tips geben !



  • ich sehe in trisize() kein objekt vom typ KlasseB. das brauchste aber.



  • Ja stimmt, habe ich hinzugefügt.
    Es geht mit nur darum eine Kette an Pointer/Refernzübergaben über mehrere Klassen zu schaffen, aber beginnend bei einem Iterator.



  • Inf666 schrieb:

    Ja stimmt, habe ich hinzugefügt.

    na, dann geht ja jetzt

    void KlasseC::trisize()               
    { 
    int i = 3; 
    KlasseA tmpsol = klassebinst.getKlasseA(i); 
    tmpsol.TueEtwas();   
    }
    

    und die kopie vermeidest du ganz wie bereits gean mit

    void KlasseC::trisize()               
    { 
    int i = 3; 
    KlasseA &tmpsol = klassebinst.getKlasseA(i); 
    tmpsol.TueEtwas();   
    }
    

    oder

    void KlasseC::trisize()               
    { 
    int i = 3; 
    KlasseA *tmpsol = *klassebinst.getKlasseA(i); 
    tmpsol.TueEtwas();   
    }
    

    Es geht mit nur darum eine Kette an Pointer/Refernzübergaben über mehrere Klassen zu schaffen, aber beginnend bei einem Iterator.

    der iterator zeigte nur auf ein KlasseA, da kannste dich nicht davon aus weiterhaneln, denn KlasseA ist ja recht platt. nur drei doubles.
    wie wär's damit?

    //ungetestet
    struct Elefant{
       Elefant* papa;
       Elefant* mama;
       vector<Elefant*> kinder;
       string name;
    };
    

    gegeben sei Elefant jumbo. baue eine funktion, die alle elefanten anzeigt, die mit jumbo ein kind gemensam haben. da müßtest du über jumbos kinderliste iterieren und von jedem aktuelen iteratorjeweils nach papa und mama hochgehen. und wenn wir keine doppelten asgaben wollen, auch noch sort() und unique() üben.



  • [cpp]
    const KlasseA &tmpsol = klassebinst.getKlasseA(i);
    [/cpp]



  • erstmal danke für die hilfe, werde es mal austesten.

    Ich verstehe allerdings noch nicht was die Elefanten machen sollen. Ich erzeuge eine maschenartige Struktur und kann über die Pointer zwischen den einzelnen Elementen hin und herwechseln.

    Ich habe erstmal bei mir alle Listen durch Vektoren ersetzt. Das ist jetzt wesentlich angenehmer. (und schneller)


Anmelden zum Antworten