Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Wie heißt das instanceof in C++

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
01.03.2006, 10:15 Uhr
~Hilfesuchender
Gast


Hallo,

eine Anfängerfrage...aber ich finde irgendwie nix passendes...in c++ sind irgendwie die Methodennamen nicht so ganz intuitiv...

Ich brauche eine Methode um die Klasse eines Objekts zur Laufzeit zu ermitteln..also sowas wie:

if (object instanceof Foo){
bla
}

Mir fällts einfach nicht ein, wie das noch noch mal war....bitte helft mir.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.03.2006, 10:27 Uhr
Spacelord
Hoffnungsloser Fall


typeid liefert dir ne Referenz auf nen type_info Objekt.Damit kannst du dann was anfangen.
Zum testen wäre auch nen dynamic_cast denkbar.dynamic_cast liefert NULL wenn das zu castende Objekt nicht vom Zieltyp ist.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.03.2006, 11:29 Uhr
stephanw
localhorst


Oder man überdenkt den Ansatz und versucht es ohne die Typunterscheidung hinzubekommen. Manches lässt sich in C++ mit Templates typsicherer machen als in Java, z.B. Container-Klassen.
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.03.2006, 11:34 Uhr
Spacelord
Hoffnungsloser Fall



Zitat von stephanw:
Oder man überdenkt den Ansatz und versucht es ohne die Typunterscheidung hinzubekommen.


Yep,im Allgemeinen deutet diese Art von Typüberprüfung auf irgendwelche Designschwächen hin.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.03.2006, 12:36 Uhr
~Hilfesuchender
Gast


Hi,

zunächst mal danke für die Antwort...warum ich denke, dieses zu benötigen:

Also ich hab exceptionhandling in meine Anwendung eingebaut...die Oberklasse für die Applicationseigenen Exceptions heißt MyException (der name is eigentlich anders.....) und bietet eine reihe von netten Features, die ich bei den C++-Exceptions so nicht gefunden habe...(insgesamt fand ich die Schnittstelle der C++Exceptions wie fast alles in C++ äußerst dürftig und sehr unintuitiv)...

...die Fehlernachricht der Exception ist in ihr als CString abgelegt (es ist ein MFC-Programm) und kann mit der Methode getErrorMessage() abgefragt werden...

...insbesondere hat meine Exception dei Fähigkeit, dass sie eine nestedException haben kann. Die Klasse MyException bietet dann eine Methode getStackTrace(), die dann den ganzen Stackstapel ausgeben kann....(siehe JAVA..printStackTrace())....

...in getStackTrace() wird also rekursiv durch die exceptions gewandert und immer getErrorMessage() aufgerufen...ich wollte es aber auch so haben, dass die nestedException nicht unbedingt von MyException abgeleitet sein muß, sondern von der C++-Klasse exception.....In getStackTrace muß ich also gucken, ob die nestedException eine Unterklasse von MyException ist (...dann kann ich getErrorMessage() rufen) oder ob es eine von exception abgeleitete Klasse ist (dann muß ich irgendwas anderes machen - ich hab da what() im kopf...keine ahnung....


!!!
nichtsdestotrotz funktioniert bei mir dynamic_cast irgendwie nicht...ich kriege immer den NULL-Zeiger zurück....hat da jemand mal n beispiel...?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.03.2006, 12:55 Uhr
Spacelord
Hoffnungsloser Fall


Wenn das ne MFC Anwendung ist musst du erstmal explizit RTTI aktivieren.Das ist bei nem Standard MFC Projekt deaktiviert.
Findest du irgendwo in den Projekteinstellungen unter C++/Programmiersprache C++.

Ansonsten

C++:
#include <iostream>

class foo
{
public:
    virtual ~foo(){};
};

class bar:public foo
{
public:
    virtual ~bar(){};
};

int main()
{
    foo* b = new bar();
    if(dynamic_cast<bar*>(b) != NULL)
        std::cout<<"Objekt ist ein bar"<<std::endl;
    else
        std::cout<<"Objekt ist kein bar"<<std::endl;

    foo* f = new foo();
    if(dynamic_cast<bar*>(f) != NULL)
        std::cout<<"Objekt ist ein bar"<<std::endl;
    else
        std::cout<<"Objekt ist kein bar"<<std::endl;


    return 0;
}


Interessanter wäre es wahrscheinlich wie dein Code aussieht .

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.03.2006, 12:58 Uhr
~Hilfesuchender
Gast


Warum bringt der folgende Code beim Compilieren eine Warnung

"warning C4541: 'dynamic_cast' fuer polymorphen Typ 'class MyException' mit /GR- verwendet; unvorhersehbares Verhalten moeglich"

und bei der Ausführung von dynamic_cast() eine Exception...???...versteh ich nicht...normaleweise sollte das doch funktionieren....was mache ich falsch...

MyException * e = new MyException();
MyException * e2 = dynamic_cast<MyException *> (e);

if (e2 == NULL){
AfxMessageBox(CString("Cast nicht ok"));
} else {
AfxMessageBox(CString("cast ok"));
}


(MyException ist in dem Fall ne leere Dummy-Klasse. Ich hab sie nur eben kurz mit VisualStudio eingefügt als generische Klasse, die von nichts abgeleitet ist...)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
01.03.2006, 13:04 Uhr
Spacelord
Hoffnungsloser Fall


Siehe meine letzten Post...... RTTI aktivieren!

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.03.2006, 13:47 Uhr
Spacelord
Hoffnungsloser Fall


Eventuell interessiert dich ja das:
www.cuj.com/documents/s=9153/cuj0311antony/cuj0311antony.htm

oder das:
www.cuj.com/documents/s=8014/cuj0204nies/nies.htm

Um die kompletten Artikel lesen zu können wirst du dich erst (gratis) registrieren müssen.
Es lohnt sich aber...

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
01.03.2006, 14:29 Uhr
(un)wissender
Niveauwart


RTTI gibt es nur bei Klassen mit vt, dass heißt mit mindestens einem virtual. Also class Foo{}; hat vermutlich keine typeid.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: