dynamischer struct in einer klasse



  • kann ich die grösse eines privaten struct-array attribut einer klasse erst mit dem konstruktor bekanntmachen? wenn ja, wie?

    bsp:

    class foo
    {
      private:
       struct bar { int x; int y; };
       struct bar dings; // dieses dings soll mit dem konstruktor zu einem array werden
    
      public:
       foo(int);
    };
    
    foo::foo(int groessedesdings)
    {
      dings = new dings[groessedesdings]; // irgendwie so müsste das doch gehen, nur wie genau?
    }
    

    [edit]
    ach hat sich gerade geklärt...
    dings = new bar[groessedesdings];

    und dings muss ein pointer sein, warum eigentlich? ich weiss alle elemente die mit new erzeugt werden, müssen pointer sein, aber wieso genau?
    [/edit]



  • class foo 
    { 
      private: 
       struct bar { int x; int y; }; 
       bar * dings; // dieses dings soll mit dem konstruktor zu einem array werden 
    
      public: 
       foo(int); 
    }; 
    
    foo::foo(int groessedesdings) 
    { 
      dings = new bar [groessedesdings]; // irgendwie so müsste das doch gehen, nur wie genau? 
    }
    

    Empfehlen würde ich aber:

    std::vector<bar> dings;

    Da kannste mit size() die größe ermitteln (wieviel is drinn )
    push_back() ein Element einfügen
    und [] auf die Elemente zugreifen.

    Du musst Dich dann nicht mehr auf den Speicher konzentrieren. (new und delete krempel)



  • gz schrieb:

    und dings muss ein pointer sein, warum eigentlich? ich weiss alle elemente die mit new erzeugt werden, müssen pointer sein, aber wieso genau?
    [/edit]

    ganz einfach: weil new eine speicheradresse liefert 😉
    Du könntest die adresse zwar in ne referenz speichern (verbessert mich wenn ich falsch liege) aber aus der referenz bekommst du die adresse später nichtmer heraus -> speicherleck da delete wiederum ne adresse erwartet



  • Oi!

    Du kannst Doch nich zum gleichen Zeitpunk Editieren wo ich Antworte.
    PÜH! 🤡

    Du, wenn Du std::vector nimmst brauchst kein delete mehr 🤡

    void fn1(std::vector<bar> & foo)
    {
       // Hier was mit foo machen
    }
    
    {
    std::vector<bar>  foo;
    
    // bla bla bla
    
    fn1(foo);
    
    } // hier wird foo zerstört weil aus dem Sichtbarkeitsbereich
    

    Aber drauf achten:

    Wenns vector<bar*> foo; heisst musste dennoch alle bars* löschen und
    vector<bar> foo; erzeugt beim Einfügen eine Kopie von bar.



  • danke für euere antworten!
    wieder was gelernt 🙂

    gz



  • THE_FreaK schrieb:

    gz schrieb:

    und dings muss ein pointer sein, warum eigentlich? ich weiss alle elemente die mit new erzeugt werden, müssen pointer sein, aber wieso genau?
    [/edit]

    ganz einfach: weil new eine speicheradresse liefert 😉
    Du könntest die adresse zwar in ne referenz speichern (verbessert mich wenn ich falsch liege) aber aus der referenz bekommst du die adresse später nichtmer heraus -> speicherleck da delete wiederum ne adresse erwartet

    Zwar nur aus dem Draft, aber ich denke daran hat sich nichts geaendert:

    5.3.4 New [expr.new]

    1 The new-expression attempts to create an object of the type-id
    (_dcl.name_) to which it is applied. This type shall be a complete
    object type, but not an abstract class type or array thereof
    (_intro.object_, _basic.types_, _class.abstract_). [Note: because
    references are not objects, references cannot be created by new-
    expressions. ] [Note: the type-id may be a cv-qualified type, in
    which case the object created by the new-expression has a cv-qualified
    type. ]

    mfg
    v R


Anmelden zum Antworten