Element eines Basis Object Arrays soll etwas anderes werden!



  • Moin,

    Eben Bsp. Code.

    class A{};
    class B : public A{};
    
    void func(int size){
        A* array = new A[size];
        array[irgendwo] = new B(); // Fehler!
    
    }
    

    Egal wie ich es drehe und wende ich bekomme diesen Ausdrcuk nicht fehler frei
    compeliert.
    Ich komme aus der "Java-Scene",(Genauer gesagt versuch ich gerade ein Java Project in C++ umzusetzen.)
    und verzweifele nun an dem Versuch hier die Polymorphie umszuseten soweit ich die gelernt habe 🤡 . Sollte ja theoretisch
    auch möglich sein in C++ nur wie bzw. wie setzte ich das um? Oder liege ich hier komplett falsch?

    MFG Walter :xmas1: :xmas2:



  • Ich wuerde es mal mit

    A* array = new A*[size];
    

    versuchen, denn wenn du neuen speicher anforderst

    array[irgendwo] = new B();
    

    muss das Arrayelement auch ein Zeiger sein.
    Nebenbei duerftest du probleme bekommen wenn du wieder aus der Funktion rausspringst, da dein Zeiger array gelöscht wird und du somit nichtmehr an den reservierten Speicherplatz rankommst => Zombiespeicher

    MFG
    chewbo



  • chewbo schrieb:

    Ich wuerde es mal mit

    A* array = new A*[size];
    

    versuchen, denn wenn du neuen speicher anforderst

    Sogar noch einen Schritt weiter - du benötigst ein Array von Zeigern, für dessen Adresse mußt du einen Doppelzeiger anlegen:

    A** array = new A*[size];
    array[irgendwo] = new B;
    
    //Achtung - aufräumen nicht vergessen:
    delete array[irgendwo];
    delete[] array;
    

    PS: Und die Klasse A benötigt einen virtuellen Destruktor, sonst landest du mit dem "delete array[irgendwo]" im Bereich des undefinierten Verhaltens.



  • chewbo schrieb:

    ...
    Nebenbei duerftest du probleme bekommen wenn du wieder aus der Funktion rausspringst, da dein Zeiger array gelöscht wird und du somit nichtmehr an den reservierten Speicherplatz rankommst => Zombiespeicher

    MFG
    chewbo

    Deswegen würde ich Schlee auch Folgendes vorschlagen:
    ------
    NACHTRAG: Hat CStoll wieder mal schneller, besser und umfassender beantwortet...
    (Du legst kein Array von As an, sondern vo Zeigern auf A (macht java eigentlich auch) )
    erster Vorschlag deleted
    ----

    Alternativ (eigentlich sogar komfortabler) kannst Du auch mit vector<A*> arbeiten - der verwaltet die Länge für Dich und Du kannst die Länge auch noch "zur Lebenszeit" ändern.

    #include <vector>
    
    class A{ public: virtual ~A() {} };
    class B : public A{};
    
    // wenn etwas nur positiv sein kann, sollte man das sagen -> unsigned
    void func(unsigned int size){ 
        std::vector<A*> v;
        for(unsigned int i=0; i<size; ++i) v.push_back(new A());
    
        unsigned int irgendwo = 2;
        delete v[irgendwo];
        v[irgendwo] = new B();
    
        // später wieder aufräumen (macht man besser mit RAII 
        // - aber das erkläre ich nicht hier)
        for(unsigned int i=0; i<v.size(); ++i) delete v[i];    
    }
    

    Gruß,

    Simon2.


Anmelden zum Antworten