Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何知道列表中对象的类型?_C++_Casting - Fatal编程技术网

C++ 如何知道列表中对象的类型?

C++ 如何知道列表中对象的类型?,c++,casting,C++,Casting,我想知道列表中的对象类型(或类型),所以我写了以下内容: 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

我想知道列表中的对象类型(或类型),所以我写了以下内容:

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");
}
为什么会这样?我做错了什么?我应该在这里使用动态投影吗

提前谢谢

编辑:

<>我知道上面的代码很像纯C,当然从C++的观点来看是很糟糕的,但我只是有以下情况,我在尝试实现它之前尝试了一些东西:

我有两个长度为n的数组,但两个数组在同一索引处永远不会有对象。 因此,或者说我已经准备好了=空或数组2[i]=无效的这显然是对内存的浪费,所以我认为如果我可以在一个长度为n的数组中同时包含这两种对象,那么所有问题都可以解决

我看起来像Cocoa的(Objective-C)NSArray,您不关心要放入的对象的类型。不知道对象的类型不是问题,因为以后可以使用其他方法获取某个对象的类。C++中是否有类似的内容(最好不是第三方C++库)?< /P>
提前感谢;)

Dynamic_cast对空指针不起作用。您需要在列表中存储类型化指针(例如指向公共基类的指针),或者使用reinterpret_cast(请非常小心,因为即使转换没有任何意义,reinterpret_cast也会成功!)

Dynamic_cast在无效指针上不起作用。您需要在列表中存储类型化指针(例如指向公共基类的指针)或使用reinterpret_cast(请非常小心,因为即使转换没有任何意义,reinterpret_cast也会成功!)

在执行此类操作之前,我建议您阅读以下内容:


阅读至少前两个回复。

在您进行此类操作之前,我建议您阅读以下内容:


阅读至少前两个回复。

您应使用boost::variant或boost::any来实现此目的。仅当源类型和目标类型通过继承链接时,dynamic_cast才起作用。另外,在绝大多数代码中使用void*s是非常糟糕的风格,因为它是完全不安全的

实际上,阅读你的代码,我只是建议你得到一本C++基础书籍。
编辑:dynamic_cast仅适用于通过继承链接且基类中至少有一个虚拟函数的类型。

您应使用boost::variant或boost::any来实现此目的。仅当源类型和目标类型通过继承链接时,dynamic_cast才起作用。另外,在绝大多数代码中使用void*s是非常糟糕的风格,因为它是完全不安全的

实际上,阅读你的代码,我只是建议你得到一本C++基础书籍。
<>编辑:DealCype只对继承的类型进行操作,在基类中至少有一个虚函数。

< p>你的代码对于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");
}

你的代码对于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");
}

这完全是一个实验,我意识到虚空的不安全性。但我尝试了一些东西,现在我意识到这是个坏主意。谢谢你提到boost::variant和boost::any这完全是一个实验,我意识到void的不安全性*但我尝试了一些东西,现在我意识到这是个坏主意。感谢您提及boost::variant和boost::Any,您想实现什么?C++是一种静态类型的语言,你想通过动态类型的对象来创建什么特性。如果我们知道这一点,也许我们可以提供一个更有用的答案。你想实现什么?C++是一种静态类型的语言,你想通过动态类型的对象来创建什么特性。如果我们知道这一点,也许我们可以提供一个更有用的答案。