Zeiger einer Liste übergeben



  • Hallo,

    ich habe folgendes Problem:

    ich habe eine Liste mit Zeigern erstellt. Diese Zeiger beschreiben Klassenelemente, die miteinander verknüpft sind (es soll ein Baum sein).

    um den Baum zu beschreiben möchte ich nun ein neue Klasse erstellen, die einen Zeiger auf die vorhandene Liste bekommt.

    geht das?



  • Yazi schrieb:

    geht das?

    ja 😃



  • und wie ?



  • Yazi schrieb:

    und wie ?

    class ast
    {
     //...
    }
    
    class baum
    {
      ast **liste //<- zeiger auf liste mit zeigern vom typ ast
    
    }
    

    hoffe das hilft, so ganz versteh ich noch net was du genau willst



  • class listPointer
    {
        private:
          std::list< objects* >* pointerToList;
        public:
          ....
    };
    

    Meinst du sowas?

    Lg freeG



  • vielen dank genau sowas meine ich



  • Aber die Frage ist ob du wirklich einen Zeiger auf die Liste brauchst, es wäre besser die Liste direkt in der Klasse zu verwalten, da du sonst vll den Zeiger benutzt obwohl die Liste nicht mehr vorhanden ist. Oder du benutzt zwar einen Zeiger auf die Liste verwaltest sie aber auch in der Klasse, du erstellst und befüllst die Liste also im Konstruktor und gibst den Speicher der einzelnen Objekte und den Speicher der Liste im Destruktor wieder frei. Denn dann besteht diese Gefahr schonmal nicht, da außerhalb der Klasse niemand den Speicher freigeben kann, außer du machst das selber in einer anderen Elementfunktion.

    Du musst natürlich auch aufpassen ob die Objekte auf die die Zeiger in der Liste zeigen noch bestehen, denn sonst crasht es ordentlich wenn du die Zeiger nutzen willst.

    Aber das sollte dir eigentlich alles klar sein wenn du mit Zeiger rumhantierst;-)

    Lg freeG



  • Ich verstehe nicht, warum hier eine list verwendet wird, ein vector ist sicher schneller. Wenn du eine list verwendest brauchst du überhaupt keine Zeiger, bei einem vector schon. Aber wenn dann speichere einen std::unique_ptr<T>, wenn du ihn hast, oder eben einen std::shared_ptr.



  • 314159265358979 schrieb:

    Wenn du eine list verwendest brauchst du überhaupt keine Zeiger, bei einem vector schon.

    Erkläre das mal bitte. (Achtung, mögliche Fangfrage bzw -bitte).



  • Wenn ich per value in einem vector speichere und jedes Element einen Zeiger auf ihr Child-Element hat, werden die Zeiger beim Einfügen von Elementen in den vector ungültig, da möglicherweise Elemente umkopiert werden müssen, wenn man nicht .reserve() verwendet. Bei einer list passiert das nicht.



  • Ok, so langsam verstehe ich, wie's gemeint ist. Meine Interpretation:

    struct node
    {
      node *links;  // nehme mal einfach einen
      node *rechts; // Binaerbaum an. :)
      zeug_t zeug;
    };
    
    class tree
    {
      std::list<node> nodes_;
      ...
    };
    

    Ja, das könnte man so machen. Zumindest spart man sich so einen selbst geschriebenen Destruktor für tree. Kopierkonstruktor und Zuweisungsoperator müsste man aber noch explizit abschalten oder selbst definieren -- wegen den ganzen links/rechts-Zeigern.


Anmelden zum Antworten