vector<basisklasse> kopieren und info "Vererbte klasse" und deren Attribute behalten



  • Hallo zusammen,

    ich habe mein Problem mal so weit runtergebrochen wie möglich. Bin ein Anfänger in C++ und kenne mich gerade im Bereich Vererbung und Polymorphismus sehr schlecht aus. Nach stundenlanger Suche verzweifle ich nun und erstelle meinen ersten Thread.

    Ich würde gerne einen Vektor kopieren, der als Typ die Basisklasse enthält. Allerdings weiß ich nicht richtig wie. Möchte ich auf die kopierten Objekte der Child-Klasse zugreifen, so funktioniert das nicht.
    Mein bisheriger Ansatz war nicht erfolgreich (siehe folgender Code)

    #include <vector>
    
    using namespace std;
    
    class strassenobjekt
    {
    public:
        int typ;
        int abstand_links;
        int abstand_rechts;
    
        strassenobjekt(int typ,int abstand_links, int abstand_rechts)
        {
    
            this->typ = typ;
            this->abstand_links = abstand_links;
            this->abstand_rechts = abstand_rechts;
        }
        virtual int getValue()
        {
            return -1;
        }
    };
    
    class lane : public strassenobjekt
    {
    public:
        int laneStyle;
    
        lane(int lanestyle, int typ, int abstand_links, int abstand_rechts)
            : strassenobjekt(typ,abstand_links, abstand_rechts),laneStyle(lanestyle)
        {
    
        }
    
        int getValue()
        {
            return laneStyle;
        }
    };
    
    class barrier: public strassenobjekt
    {
    public:
        int barrierStyle;
    
        barrier(int barrierstyle, int typ,int abstand_links, int abstand_rechts)
            : strassenobjekt(typ,abstand_links, abstand_rechts),barrierStyle(barrierstyle)
        {
    
        }
    
        int getValue()
        {
            return barrierStyle;
        }
    };
    
    int main()
    {
    
        vector<strassenobjekt*> * Liste1 = new vector<strassenobjekt*>;
        vector<strassenobjekt*> * Liste2 = new vector<strassenobjekt*>;
    
        lane * linie1 = new lane(1,2,3,4);
        barrier * linie2 = new barrier(5,6,7,8);
        Liste1->push_back(linie1);
        Liste1->push_back(linie2);
    
        *Liste2 = *Liste1;                           //damit die Größe auch stimmt
        for(int i = 0; i<Liste1->size();i++)
        {
            strassenobjekt * das_i_te = new strassenobjekt(0,0,0); //Hier liegt wohl das Problem...
            *das_i_te = *Liste2->at(i);            //Wert von Adresse
            Liste2->at(i)=das_i_te;                  //Adresse wird geändert, Wert bleibt gleich
    
        }
    
            strassenobjekt *test1 = Liste1->at(1);
            strassenobjekt* test2 = Liste2->at(1);
    
            cout << test1->getValue() << endl;
            cout << test2->getValue() << endl;
    cout
    };
    

    Output:

    5
    -1
    

    Also das Problem bei der ganzen Geschichte ist, dass die Basisklasse-Attribute kopiert werden, aber nicht das Objekt an sich.. Somit habe ich nurnoch die Attribute der Basisklasse und das Objekt weiß nicht, dass es eigentlich von der Klasse "lane" sein soll.

    Viele Grüße

    yoko

    edit von volkard: cpp-Tags eingefügt.



  • Du hast doch auch ein strassenobjekt erzeugt.

    strassenobjekt * das_i_te = new strassenobjekt(0,0,0);
    

    Also kommt am Ende auch ein strassenobjekt dabei raus.



  • und wie mache ich das dann dynamisch, dass es immer das Objekt erstellt, das ich momentan habe? Irgendwie hatte ich gehofft, das funktioniert durch das Kopieren 🙂



  • Wobei lane und barrier ja von strassenobjekt erben, weshalb ich sie überhaupt dem Vektor hinzufügen konnte. Deshalb erschien es mir logisch, dass auch beim kopieren das strassenobjekt seine vererbte Klasse erkennt.



  • yoko schrieb:

    und wie mache ich das dann dynamisch, dass es immer das Objekt erstellt, das ich momentan habe? Irgendwie hatte ich gehofft, das funktioniert durch das Kopieren 🙂

    typeid()?



  • Du wirst wohl nicht umhin kommen, irgendwie eine Kopierfunktion für deine Objekte bereitzustellen. Das einfachste ist wohl clone() als Member Funktion:

    class MyBaseClass
    {
    public:
       ~MyBaseClass()
       {
       }
    
       virtual MyBaseClass* clone() const = 0;
    };
    
    class MyDerivedClass : public MyBaseClass
    {
    public:
       MyBaseClass* clone() const
       {
          return new MyDerivedClass( *this );
       }
    };
    

    Dann musst du noch den Eingangsvektor durchlaufen und für jedes Element clone() aufrufen:

    int main()
    {
       for( vector<MyBaseClass*>::const_iterator i = ev.begin(); i != ev.end(); ++i )
      {
         av.push_back( (**i).clone() );
      }
    }
    


  • vielen Dank! ich werde das gleich mal probieren!



  • Schon was von C++-Tags gehört?



  • no 😕



  • Warum erstellst du eigentlich alles am Heap?



  • und warum gibts da kein delete?

    kommst du von Java?


Anmelden zum Antworten