Array von Instanzen



  • Hallo,

    ich habe ein kleines (Syntax oder Verständnis???) Problem:
    Ich habe eine Klasse A geschrieben, die wiederum (als protected) ein Array von Instanzen einer anderen Klasse B enthält...

    Beim erzeugen eines Objekts der Klasse A (z.B. in der main()-Funktion) werden ja dann auch z.B. fünf Instanzen der Klasse B angelegt, d.h. deren Konstruktor wird aufgerufen. Das ist ja ganz OK, solange ich den Standart-Konstruktor verwenden will, wenn ich aber einen mit Parametern verwenden muss, stehe ich vor einem Problem: Wie kann ich die Parameter für die (fünf) Klasse B Instanzen dem Konstruktor von Klasse A mitgeben, sodass dieser sie dann für die Instanzierung der (fünf) B-Objekte innerhalb von Klasse A verwendet????

    Vom Prinzip her müsste das ja mit dem vom Prinzip her mit diesem : Operator beim Standartkonstruktor von Klasse A funktionieren, ich krieg es aber einfach nicht gebacken... 😕

    mfg MAV



  • class A
    {
      protected:
        B *_array[3];
      public:
        A(int param1, int param2, int param3)
        {
          array[0] = new B(param1);
          array[1] = new B(param2);
          array[2] = new B(param3);
        }
    };
    

    bzw.

    class A
    {
      protected:
        B _array[3];
      public:
        A(int param1, int param2, int param3) : _array[0](param1), _array[1](param2), _array[2](param3)
        {
        }
    };
    


  • wobei der letztere Code eher moderne Kunst als gültiges C++ ist.

    Mein Vorschlag: verwende std::vector anstelle eines Arrays.



  • HumeSikkins schrieb:

    wobei der letztere Code eher moderne Kunst als gültiges C++ ist.

    Mein Vorschlag: verwende std::vector anstelle eines Arrays.

    jo war wohl eher eine geistige tiefflugphase 😉



  • Erst mal vielen Dank für die schnelle Antwort!!!!
    Das bringt mich schon kräftig weiter...

    Frage zum ersten Code:
    Wie kann ich dann mit anderen Methoden von A die Instanzen von B innerhalb des Feldes ansprechen???

    _array[0].Write(); //z.B. als einfache Bildschrimausgabe mit cout
    

    ...funktioniert ja jedenfalls nicht!!!!!

    Frage zum zweiten Code:
    Das lässt sich zumindest bei mir (VS Studio.Net) nicht compilieren!
    Meldung: Syntaxfehler '['



  • Da _array ja aus Pointern besteht, mußt du die Elemente für den Zugriff dereferenzieren:

    _array[i]->write();
    

    (achja, nur der Vollständigkeit halber: zu dem Code sollte auch noch ein Destruktor gehören, der delete auf alle drei Elemente anwendet - und Copy-Konstruktor und operator=() für eine saubere Kopie)



  • OK... jetzt ist alles klar... funktioniert prima



  • Wie schon erwähnt wurde, brauche ich ja auch noch einen Destruktor, der per "delete" alle Instanzen der Klasse B im Feld _array bzw. deren Speicher auf dem Heap löscht!!!!

    Kann ich das so machen?

    ...
    ~B() {delete *_array;} //inline Destruktor für B 
    ..
    

    Wird damit nicht nur das erste Element von _array (also Index 0) gelöscht???

    Gruß
    MAV



  • ... sorry ich hab noch was vergessen:
    Mir ist schon klar, dass ich das gesamte Array z.B. mit folgendermaßen löschen könnte.

    ~A()
    {
        delete _array[0];
        delete _array[1];
        delete _array[2];
    }
    //geht natürlich nur wenn B auch einen Destruktor hat!!!!
    

    Oder ich könnte das natürlich auch in einer Schelife abrattern, weil es ja in echt mehr als 3 Objekte im Array sein sollen!!

    Ich denke aber das müsste auch eleganter gehen, oder???



  • MAV_today schrieb:

    //geht natürlich nur wenn B auch einen Destruktor hat!!!!

    Musst du auf jeden Fall machen und hat nichts damit zu tun ob B einen Destruktor hat.
    Das eleganteste was mir da einfällt ist eine Schleife.
    Kurt



  • MAV_today schrieb:

    Ich denke aber das müsste auch eleganter gehen, oder???

    Ja, nimm statt des Arrays einen vector<B> - der weiß von selber, wie er hinter sich aufräumen muß 😉

    class A
    {
      vector<B> array;
    public:
      A(int p1=0,int p2=0,int p3=0)
      {
        array.push_back(B(p1));
        array.push_back(B(p2));
        array.push_back(B(p3));
      }
    };
    

    (dafür benötigst du einen Konstruktor "B::B(int);" - andernfalls mußt du die push_back()-Aufrufe anpassen)



  • Ja, nimm statt des Arrays einen vector<B> - der weiß von selber, wie er hinter sich aufräumen muß

    Wobei dir hier die Performance Heini's aufs dach steigen wuerden ^^

    vector ist ersatz fuer ein dynamisches Array also was in der art
    T * array = new T[X];

    hab glaub ich was in der "Aufgabenstellung" von einer fixen arraygroesse von 5 gelesen, da waer ich mit nem vector scho wieder vorsichtiger 🙂
    Wenn performance egal ist, ok, dann soll hinnerher aber auch keiner meckern ...

    Deshalb die frage, iss die 5 wirklich fix, so fix wie das amen in der kirche ???

    Braucht er wirklich nen Array ?

    Bei 3D Punktklassen definiert man meist auch 3 unabhaengige variablen und kein Array ^^

    Weiterhin fallen so Laute wie "sofort 5 instanzen erstellen im Konstruktor" was eindeutig auf ne composition hindeutet ... ob ich das "dynamisch" machen wuerd ?

    Dazu weiss ich aber zu wenig von der aufgabenstellung ^^

    Ciao ...


Anmelden zum Antworten