Array von Instanzen



  • 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