我正在尝试创建一个包含std::vector
void*
的类。有人告诉我,void*
是Java中与Object
等效的C ++。由于这是用Java编写的程序的C ++端口,因此它应该在理论上起作用。
爪哇:
ArrayList<Object> list;
C ++:
vector<void*> list;
这不会编译,给出错误:“'reference':非法使用'void'类型。”
void*
真的是Java的Object
的C ++等价物吗?我用错了吗?
答案 0 :(得分:6)
Java Object
是一个基础基类,它为所有Java类提供了一些公共属性。
C ++中没有这样的东西。如果要设计多态层次结构,可以设计自己的基类MyBaseClass
(抽象与否),然后设计派生类。
因此,创建vector<void*>
容器在技术上是可行的,但它没有意义。对于正确的软件设计,您需要的是设计基类MyBaseClass
,以便您能够创建vector<MyBaseClass*>
个容器。
答案 1 :(得分:4)
指向void的指针意味着你有一些东西的内存地址,但你不知道那是什么类型的东西。您可以使用任何类型的指针创建向量,然后在向向量中添加项时,可以将指针强制转换为在向量声明中使用的任何指针。这很好但它会在语法上起作用。不利的一面是你不知道向量中有哪些数据项。
答案 2 :(得分:1)
你在这两点都是正确的。
void*
不是Object
的C ++等效词
在C ++中没有等价物。无法就您应该做什么提供任何建议,因为您没有提供任何有关您想要完成的信息。
答案 3 :(得分:1)
void*
vs Object
。这些肯定不是等价的,void*
变量包含没有类型的内存地址(它没有方法,也可以指向基元),Object
变量是引用到对象,它是Object
类的一个实例或其中一个子类(因此有一些方法,多态性的可能性,并且不能引用基本类型)。
比较可能意味着,如果在c ++中你想存储任何类的对象,你可以使用void*
然后在评估时根据需要进行投射。通过这种方式,他们可以做同样的事情。
编译错误可能是由于您在创建列表后对列表所做的事情造成的,因为解释void*
不能将其视为Object
。