PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Klasse zur Laufzeit bestimmen



rtsx
24-12-2005, 01:54
Hallo,

ich habe eine Konsolenanwendung, die unter Linux wunderbar läuft, versucht unter Windows zu kompilieren. Leider gibt es da mehr Übersetzungsfehler als ich dachte.

Folgende Zeile bestimmt ob ein übergebener Contact privat oder geschaeftlich ist ( Privat und Geschaeftlich erben von Contact)

bool contact_art =((string)(typeid(*cont).name())).find("Privat",0)!=string::npos;

Es gibt ein Contact Array in das je nach Auswahl ein new Privat () oder new Geschaeftlich () erzeugt wird. Von diesem Array wird dann ein Contact in der Methode behandelt die die obige Zeile beinhaltet.
Da bei der Typenausgabe immer irgend eine Zahl dabei steht suche ich nach dem String Privat wenn er gefunden ist hat contact_art true.

Unter Linux funktioniert das einwandfrei, unter Windows schreibt er mir aber nicht die wirkliche Klasse sondern lediglich die Klasse Contact, wodurch ich keine Auswahl treffen kann.
Weiss einer wie ich das Problem umgehen kann, oder gibt es eine bessere Methode um die Klasse zur Laufzeit zu bestimmen ?

gruss
RTSX

anda_skoa
24-12-2005, 07:46
Du gehts das falsch an.

typeid ist Compilerabhängig, benutze besser einen dynamic_cast



Contact* c = new Privat();

Privat* p = dynamic_cast<Privat*>(c);
if (p != 0)
{
}


Ciao,
_

rtsx
25-12-2005, 01:21
Hi,

danke für den Tipp, aber ich habe festgestellt das meine Art doch ging, ich hatte lediglich bei "Aufraeumaktionen" die virtuellen Methoden entfernt und dann gings nicht mehr, wieder eingesetzt und schwub gehts ;)

Trotzdem danke fü den Hinweis mit dem dynamic cast ich werde mir das beim nächsten Programm mal genauer anschaun.

noch schöne Feiertage.

Joghurt
25-12-2005, 15:24
type_id.name ist wie gesagt compilerabhängig. Das Programm kann also durchaus unter G++ und MSVC compiliert laufen, auf anderen compilern aber nicht mehr, da Privat dann z.B. den Namen "_VahPehn" hat.
Außerdem ist dynamic_cast schneller.