Downcast mit Boost Pointer Container



  • Hi Leute,

    ich hab ein wahrscheinlich total einfaches problem aber steh irgendwie auf dem schlauch 😞

    Ich will Objekte einer Klassenhierarchie speicher..

    class BaseClass
    {
        string sharedAttrib;
        void sharedFunc();
    }
    
    class ChildA : public BaseClass
    {
        string uniqueAAttrib;
        void uniqueAFunc();
    }
    
    class ChildB : public BaseClass
    {
        string uniqueBAttrib;
        void uniqueBFunc();
    }
    

    Es geht also darum das meine Child-Klassen neben den Elterneigenschaften noch individuelle Attribute und Funktionen haben die ich auch brauche und wichtig sind..

    erst hatte ich das ganze in nem normalen std::list gespeichert, aber dann wird ja gesliced und die uniqueFelder sind weg, also bin ich auf boost::ptr_list umgestiegen..

    Nun mein Problem: Wie krieg ich die einzelnen Objekte aus der Liste wieder so gecasted das ich auf die uniqueFelder rankomm? irgendwie hab ichs weder mit indirekten casts noch mit static/dynamic_cast geschafft (wahrscheinlich bin ich irgendwo bei den pointern durcheinandergekommen 😉 )..

    Im endeffekt will ich folgendes machen:

    boost::ptr_vector<BaseClass> list;
    list.push_back(new ChildA);
    list.push_back(new ChildB);
    list.push_back(new BaseClass);
    
    boost::ptr_vector<BaseClass>::iterator it = list.begin();
    
    while( it != list.end() )
    {
        if( /* hier dann irgendeine Prüfung ob das aktuelle objekt eigentlich vom Typ zB ChildA ist.. wahrscheinlich irgendwie mit typeid, aber ich bin mir nicht sicher ob das typeid nur auf den list-typ geht oder den echten typ vom objekt nimmt*/ )
        {
            /* und hier jetzt irgendwas, damit man das aktuelle ListObjekt wieder auf seinen ursprünglichen typ kriegt, also in dem fall ChildA */
            cout << it->uniqueAAttrib << endl;
        }
        else
        {
            cout << it->sharedAttrib << endl;
        }
        ++it;
    }
    

    Hat irgendwer ne idee wie das geht?

    Vielen Dank schon mal!


  • Administrator

    DragonTEC schrieb:

    Hat irgendwer ne idee wie das geht?

    Am einfachsten in dem du zwei Listen machst. Einmal eine Liste für ChildA Objekte und einmal eine Liste für ChildB Objekte. dynamic_cast ist in C++ in 99,99% der Fälle ein Hinweis auf einen Designfehler.

    Ansonsten hier noch ein Beispiel, wie man den dynamic_cast einsetzen würde (du musst RTTI eingestellt haben und mindestens eine virtuelle Funktion in der Hierarchie haben. Es ist empfehlenswert mindestens den Destruktor virtuell zu machen.):

    void doSomething(BaseClass* baseObj)
    {
      ChildA* childA = dynamic_cast<ChildA*>(baseObj);
    
      if(childA)
      {
        // ist ein gültiger childA Zeiger ...
      }
    
      ChildB* childB = dynamic_cast<ChildB*>(baseObj);
    
      if(childB)
      {
        // ist ein gültiger childB Zeiger ...
      }
    }
    

    Grüssli


Anmelden zum Antworten