2010-12-26 20 views
0

ich den Typ des Objekts (oder Typ) Ich habe in meiner Liste wissen wollen, so schrieb ich folgendes:Wie erkennt man den Typ eines Objekts in einer Liste?

void **list; //list of references 
list = new void * [2]; 
Foo foo = Foo(); 
const char *not_table [] = {"tf", "ft", 0 }; 

list[0] = &foo; 
list[1] = not_table; 

if (dynamic_cast<LogicProcessor*>(list[0])) { //ERROR here ;(
    printf("Foo was found\n"); 
} 
if (dynamic_cast<char*> (list[0])) { //ERROR here ;(
printf("char was found\n"); 
} 

aber ich bekomme:

error: cannot dynamic_cast '* list' (of type 'void*') to type 'class Foo*' (source is not a pointer to class) 
error: cannot dynamic_cast '* list' (of type 'void*') to type 'char*' (target is not pointer or reference to class) 

Warum ist das? was mache ich hier falsch? Ist dynamic_cast was ich hier benutzen soll?

Vielen Dank im Voraus

EDIT:

ich über Code weiß viel wie Ebene C und saugt sicher von der C++ Sicht aber nur habe ich die folgende Situation und ich war, bevor wirklich etwas versuchen, Implementierung:

Ich habe zwei Arrays der Länge n, aber beide Arrays werden nie ein Objekt auf dem gleichen Index haben. Also, oder ich habe array1 [i]! = NULL oder array2 [i]! = NULL. Dies ist offensichtlich eine Verschwendung von Speicher, so dass ich dachte, dass alles gelöst wäre, wenn ich beide Arten von Objekten in einem einzigen Array der Länge n hätte.

Ich suche etwas wie Cocoa (Objective-C) NSArray, wo Sie nicht um den Typ des Objekts kümmern. Nicht zu wissen, der Typ des Objekts ist kein Problem, da Sie eine andere Methode verwenden können um später die Klasse eines bestimmten zu bekommen. Gibt es so etwas in C++ (vorzugsweise nicht C++ - Bibliotheken von Drittanbietern)?

Vielen Dank im Voraus;)

+0

vorschlagen würde, was Sie versuchen zu erreichen? C++ ist eine statisch typisierte Sprache, welche Funktion Sie durch dynamisch typisierte Objekte zu erfinden versuchen. Wenn wir das wissen, können wir vielleicht eine nützlichere Antwort geben. –

Antwort

2

Sie sollten eine boost :: variant oder boost :: any verwenden, um diesen Zweck zu erreichen. dynamic_cast funktioniert nur, wenn Quell- und Zieltypen durch Vererbung verknüpft sind. Außerdem ist die Verwendung von void * s ein schrecklicher, schrecklicher Stil in der überwältigenden Mehrheit des Codes, da es völlig unsicher ist.

Eigentlich, Lesen Sie Ihren Code, ich schlage nur vor, dass Sie ein C++ - Grundlagenbuch erhalten.

BEARBEITEN: dynamic_cast funktioniert nur bei Typen, die durch Vererbung verknüpft sind und mindestens eine virtuelle Funktion in der Basisklasse haben.

+0

Dies war komplett ein Experiment und ich bin mir der Unsicherheit von void bewusst, aber ich versuchte etwas und ich merkte, dass es eine schlechte Idee war. Danke für die Erwähnung von boost :: variant und boost :: any – nacho4d

1

dynamic_cast funktioniert nicht auf void-Zeiger. Sie müssen stattdessen typisierte Zeiger in Ihrer Liste speichern (z. B. Zeiger auf eine gemeinsame Basisklasse) oder stattdessen reinterpret_cast verwenden (und sehr vorsichtig damit sein, da reininterpret_cast erfolgreich ist, selbst wenn die Konvertierung keinen Sinn ergibt!)

1

Ihr Code ist schrecklich für C++, aber in C sind diese Dinge ziemlich häufig ... Wenn Sie keine C++ - Funktionen in Ihrem Programm verwenden, sollten Sie vielleicht die Fragekategorie in C ändern?

Wenn Sie machen wollen es C-wie dann ich so etwas

enum type{ type1, type2, typeChar, typeFoo } 

struct ptr{ 
    void * p; 
    type t; 
}; 

ptr* list=new ptr[2]; 
list[0].p = &foo; 
list[0].t = typeFoo; 
list[1].p = not_table; 
list[1].t = typeChar; 

if (list[0].t == typeChar){ 
    printf("char was found\n"); 
} 
if (list[0].t == typeFoo){ 
    printf("Foo was found\n"); 
} 
Verwandte Themen