getType() ???



  • Ich habe eine Klasse A
    davon abgeleitet Klasse, B und C.

    Nun bekomme ich eines von B oder C in A und will hier eine art GetType machen um rauszufinden ob es B oder C ist, wie mache ich das?

    Sorry, bin schon etwas verwirrt, aber ich hoffe das ist das was ich sagen will ...

    Konkreter, ich habe ein Listentemplate, vom Typ A, in dem natürlich B und C drinnen sein können, und will nun nach Typ B sortieren können, bzw C und dafür muss ich ja wissen was es ist ...



  • 1. Bei richigen desigen brauchst du kein gettype. Anders gesagt nutze die polymorphi richtig.
    2. Benutze die suckfunktion im forum!
    3. wennst das wirklich brauchst hilft dir vieleicht das Schlüsselwort typeid

    mfg



  • wennst das wirklich brauchst hilft dir vieleicht das Schlüsselwort typeid

    so wies aussieht, hat Niobird basisklassenpointer, und da hilft typeid so ziemlich garnichts.

    @topic du musst entweder dynamic_cast benutzen, oder in deine Klassen eine methode einfügen die dir mitteilt, von welchem typ die Klassen sind

    als beispiel für soeine methode zb:int getClassId(), damit kannst du sowas machen:

    A* a=...;
    if(a->getClassId()==1){//objekt vom typ B
        B* b=static_cast<B*>(a);
    }
    if(a->getClassId()==2){//objekt vom typ C
        C* c=static_cast<C*>(a);
    }
    

    implementiert wär das dann zb so:

    //in A
    virtual int getClassId()=0;
    //in B
    int getClassId(){
        return 1;
    }
    //in C
    int getClassId(){
        return 2;
    }
    


  • ich bin der meinung, dass ich es sauber implimentiert habe, dass ich nicht in der lage bin mich sauber auzudrücken ist eine andere geschichte.

    glaub mir, ich bin lange genug im netz, dass ich vorher, google, newsgroups abgrase und die forensuchfunktion verwende. doch was glaubst du findet man dabei, wenn man nicht genau weiß was man sucht? allerdings scheints das was ich wollte in C# und in java zu geben.

    danke @ otze , ich habs derzeit genauso implementiert, es funktioniert auch, daher werd ichs wohl so lassen, hab eh noch genug punkte vor mir.

    eventuel fass es hier noch passt virtual: die funktionen in den abgeleitet klassen brauch dieses virtual dann nich mehr davor stehen haben? (weil hab ich bei meiner print funktion die ich auch brauche)

    bzw, gibt es etwas, sodass die funktion der basis klasse mit diesem namen und die der eigenen mit diesen namen hintereinander aufgerufen werden? nee vermutlich nicht, wäre aber cool ...



  • doch... wenn du sie virtual machst, dann werden die passenden methoden für die klasse aufgerufen, wenn du über einen basisklassenzeiger auf sie zugreifst...

    du hast zum beispeil das;

    class derived : public base
    {
        private:
                string name;
        public:
                void print()       //ist in base virtual
                {
                     base::print();     //zuerst das aus der basisklasse
                     cout << name << endl;  //dann das zusätzliche...
                }
    }
    
    int main()
    {
        base* basePtr;
        derived derivedObject;
        basePtr = &derivedObject;
        basePtr->print();  //es sollte die print funktion der derived klasse aufgerufen werden...    
    }
    


  • otze schrieb:

    als beispiel für soeine methode zb:int getClassId(), damit kannst du sowas machen:

    A* a=...;
    if(a->getClassId()==1){//objekt vom typ B
        B* b=static_cast<B*>(a);
    }
    if(a->getClassId()==2){//objekt vom typ C
        C* c=static_cast<C*>(a);
    }
    

    Warum nur schlägst du sowas vor? So einen Code schreibt man nur, wenn jemand mit einer Waffe auf einen zielt und selbst dann mit Sicherheit nicht innerhalb einer Basisklassenmethode.

    so wies aussieht, hat Niobird basisklassenpointer, und da hilft typeid so ziemlich garnichts.

    Warum nicht? Worin unterscheidet sich deiner Meinung nach

    if (typeid(*basePtr) == typeid(DerivedClass))
    ...
    

    von

    if (basePtr->GetClassId() == DERIVED_CLASS_ID)
    ...
    

    Unter der Annahme, dass die Basisklasse mindestens eine virtuelle Methode hat (und das wollen unter Berücksichtigung der öffentliche Ableitung doch schwer hoffen), liefert typeid hier den "dynamic type".

    @topic du musst entweder dynamic_cast benutzen, oder in deine Klassen eine methode einfügen die dir mitteilt, von welchem typ die Klassen sind

    Das ist der Hack. Besser wäre es allerdings den Ursprung des Problems zu bekämpfen, statt nur die Auswirkung.

    Konkreter, ich habe ein Listentemplate, vom Typ A, in dem natürlich B und C drinnen sein können, und will nun nach Typ B sortieren können, bzw C und dafür muss ich ja wissen was es ist ...

    Was spricht denn gegen eine simple virtuelle Methode? A la Template Method.

    bzw, gibt es etwas, sodass die funktion der basis klasse mit diesem namen und die der eigenen mit diesen namen hintereinander aufgerufen werden? nee vermutlich nicht, wäre aber cool ...

    Nicht direkt. Aber einen ähnlichen Effekt erreicht man genau mit dem erwähnten Template Method-Pattern (bzw. der reduzierten Version namens Non-Virtual-Interface).



  • HumeSikkins schrieb:

    otze schrieb:

    als beispiel für soeine methode zb:int getClassId(), damit kannst du sowas machen:

    A* a=...;
    if(a->getClassId()==1){//objekt vom typ B
        B* b=static_cast<B*>(a);
    }
    if(a->getClassId()==2){//objekt vom typ C
        C* c=static_cast<C*>(a);
    }
    

    Warum nur schlägst du sowas vor? So einen Code schreibt man nur, wenn jemand mit einer Waffe auf einen zielt und selbst dann mit Sicherheit nicht innerhalb einer Basisklassenmethode.

    vor ca nem viertel jahr wurde die lösung über id statt dynamic_cast hier als nonplusultra hochgelobt, und das merk ich mir halt.

    so wies aussieht, hat Niobird basisklassenpointer, und da hilft typeid so ziemlich garnichts.

    Warum nicht? Worin unterscheidet sich deiner Meinung nach

    if (typeid(*basePtr) == typeid(DerivedClass))
    ...
    

    von

    if (basePtr->GetClassId() == DERIVED_CLASS_ID)
    ...
    

    Unter der Annahme, dass die Basisklasse mindestens eine virtuelle Methode hat (und das wollen unter Berücksichtigung der öffentliche Ableitung doch schwer hoffen), liefert typeid hier den "dynamic type".

    k, wusste nicht dass typeid das auch über solche umwege schafft.

    @topic du musst entweder dynamic_cast benutzen, oder in deine Klassen eine methode einfügen die dir mitteilt, von welchem typ die Klassen sind

    Das ist der Hack. Besser wäre es allerdings den Ursprung des Problems zu bekämpfen, statt nur die Auswirkung.

    das ist natürlich klar,aber es gibt ein paar fälle, in denen das nicht klappt.

    btw: wielange braucht eigentlich ein aufruf von typeid(Class)? ist klar, dass es implementationsspezifisch ist, aber was kann man da so über den daumen gepeilt sagen?


Anmelden zum Antworten