Klassenname während der laufzeit Ermitteln?



  • Möglichkeit zu ermittlung der Klasse wärhden der laufzeit?

    Sowas in der Art:

    class Basis{
    
    .
    .
    .
    
    };
    class A : public Basis{
    
    .
    .
    .
    
    };
    class B : public Basis{
    
    .
    .
    .
    
    };
    
    Basis *p[2];
    p[0]= new A();
    p[1]= new B();
    
    p[0]->getClass() == "A"   //<-- Sowas in
    p[1]->getClass() == "B"   //<-- der Art
    


  • auf die Art geht es nur, wenn du die methode selbst schreibst 😉

    du kannst noch mit typeid arbeiten. da kriegst du zwar den namen einer klasse mit

    typeid(p[0]).name()
    

    allerdings ist der rückgabewert durch den standard nicht weiter definiert. du musst also nicht unbedingt "A" rauskriegen, sondern kannst auch zb "ABCDEZeichensalat__Class__A" bekommen.

    was aber geht, ist die typeids vergleichen:

    //wichtig, es dürfen keine referenzen oder zeiger der objekte genommen werden
    //also vorher immer dereferenzieren
    if(typeid(*(p[0]))==typeid(A)){/*ja, p[0] ist ein A*/}
    //geht auch mit den namen
    //wie sinnvoll das ist? nicht sehr ;)
    if(typeid(*(p[0])).name()==typeid(A).name()){
    
    //den rückgabewert von typeid kann man auch speichern
    std::type_info info=typeid(*(p[0]));
    

    wenn du nur wissen willst, ob es eine Klasse A ist, um dann zu casten kannst du einen dynamic_cast verwenden:

    A* obj = dynamic_cast<A*>(p[0]);
    if(obj!=NULL){/*casten hat geklappt, dies ist ein A*/}
    

    für all diese möglichkeiten musst du aber bei deinem compiler die RTTI anschalten, sonst wird nur ne exception geworfen 😉

    zuletzt ist noch zu sagen, dass all diese möglichkeiten nicht unbedingt guter stil sind, man sollte sich also 10 mal überlegen, ob man das wirklich braucht 😉



  • hört sich schonmal gut an! Wenn ich von meinem Code desigen ausgehe, ist es immer eindeutig wo welche klasesnTypen vorhanden sind.. aber so als sicherheits abfarage und evtl. zu test/debug zwecken wäre das doch mal sinnvoll!



  • BorisDieKlinge schrieb:

    hört sich schonmal gut an! Wenn ich von meinem Code desigen ausgehe, ist es immer eindeutig wo welche klasesnTypen vorhanden sind.. aber so als sicherheits abfarage und evtl. zu test/debug zwecken wäre das doch mal sinnvoll!

    für sowas gibt es debugger



  • wenn es dir nicht reicht such nach RTTI (Run-Time-Type-ID)



  • Wobei das I nicht für ID, sondern Information steht.


Anmelden zum Antworten