所以我有以下两个结构。假设我有一个无效指针,根据情况,指向包或苹果。如何检查它指向哪种结构类型,以便我可以取消引用它?
struct product
{
int price;
string name;
};
struct fruit : product
{
int weight;
};
product bag;
fruit apple;
编辑:所以这只是我在新工作中使用的代码的简化版本。我需要检查一个特定的变量,但是像水果中的权重变量一样,有时它会被一个空指针传递,有时它不是。已经有很多代码,所以从void指针改变它会太多了。我需要检查权重变量是否存在,然后根据其中的值做一些事情。
答案 0 :(得分:7)
不要在C ++中使用void*
。在客户端代码中使用void*
作为真实数据对象是有效的几乎从来没有这种情况。
在您的情况下,您需要使用void*
而不是product*
,并声明product*
虚拟的析构函数。这样,您就可以使用dynamic_cast
来测试实际对象。
更好的选择是仔细设计您的课程,介绍正确的虚拟功能,并确保从不需要知道对象的实际类型。但这是一个单独问题的话题。
答案 1 :(得分:1)
考虑到评论(void*
在现有API中已根深蒂固),解决方法将是两步演绎。首先,static_cast<product*>
您的void*
指针。接下来是dynamic_cast
product*
到fruit*
的{{1}}。
您需要向product
添加虚拟方法,否则dynamic_cast
将无效。
答案 2 :(得分:0)
只有无效指针,你才能做到。 Void指针从变量中删除所有类型信息。如果必须在运行时知道类型,则必须使用类似std::type_index
的内容。