我想知道我的列表中的对象(或类型)的类型,所以我写了这个:
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");
}
但我明白了:
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)
这是为什么?我在这做错了什么? dynamic_cast我应该在这里使用什么?
提前致谢
编辑:
我知道上面的代码很像普通的C,从C ++的角度来看肯定很糟糕,但我只是有以下情况而且我在尝试之前尝试了一些东西:
我有两个长度为n的数组,但两个数组都不会在同一个索引上有一个对象。 因此,或者我有array1 [i]!= NULL或array2 [i]!= NULL。这显然是浪费内存所以我认为如果我可以在长度为n的单个数组中同时拥有这两种对象,那么一切都将得到解决。
我看起来像Cocoa(Objective-C)NSArray,你不关心要放入的对象的类型。不知道对象的类型不是问题,因为你可以使用其他方法来得到一个以后的类。在c ++中是否有类似的东西(最好不是第三方C ++库)?
提前致谢;)
答案 0 :(得分:2)
你应该使用boost :: variant或boost :: any来实现这个目的。仅当源和目标类型通过继承链接时,dynamic_cast才有效。另外,在绝大多数代码中使用void * s是一种可怕的,糟糕的风格,因为它完全不安全。
实际上,阅读你的代码,我只是建议你得到一本C ++基础书。
编辑:dynamic_cast仅适用于通过继承链接的类型,并且在基类中至少有一个虚函数。
答案 1 :(得分:1)
Dynamic_cast不适用于void指针。您需要在列表中存储类型指针(例如指向公共基类的指针)或使用reinterpret_cast(并且要非常小心,因为即使转换没有任何意义,reinterpret_cast也会成功!)< / p>
答案 2 :(得分:1)
在你做任何类似的事情之前,我建议你阅读:
When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?
至少阅读前两个回复。
答案 3 :(得分:1)
你的代码对于C ++来说很糟糕,但是在C中这些东西很常见......如果你不在程序中使用任何c ++特性,也许你应该将问题类别改为C?
如果你想让它像C一样,那么我会建议类似的东西
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");
}