使用void *作为Java Object的C ++等价物

时间:2015-10-25 18:08:23

标签: java c++ object void equivalent

我正在尝试创建一个包含std::vector void*的类。有人告诉我,void*是Java中与Object等效的C ++。由于这是用Java编写的程序的C ++端口,因此它应该在理论上起作用。

爪哇:

ArrayList<Object> list;

C ++:

vector<void*> list;

这不会编译,给出错误:“'reference':非法使用'void'类型。”

void*真的是Java的Object的C ++等价物吗?我用错了吗?

4 个答案:

答案 0 :(得分:6)

Java Object是一个基础基类,它为所有Java类提供了一些公共属性。

C ++中没有这样的东西。如果要设计多态层次结构,可以设计自己的基类MyBaseClass(抽象与否),然后设计派生类。

因此,创建vector<void*>容器在技术上是可行的,但它没有意义。对于正确的软件设计,您需要的是设计基类MyBaseClass,以便您能够创建vector<MyBaseClass*>个容器。

答案 1 :(得分:4)

指向void的指针意味着你有一些东西的内存地址,但你不知道那是什么类型的东西。您可以使用任何类型的指针创建向量,然后在向向量中添加项时,可以将指针强制转换为在向量声明中使用的任何指针。这很好但它会在语法上起作用。不利的一面是你不知道向量中有哪些数据项。

答案 2 :(得分:1)

你在这两点都是正确的。

  1. void*不是Object的C ++等效词 在C ++中没有等价物。
  2. 您以错误的方式使用它 - 您正在取消引用向量中的元素。
  3. 无法就您应该做什么提供任何建议,因为您没有提供任何有关您想要完成的信息。

答案 3 :(得分:1)

  1. void* vs Object。这些肯定不是等价的,void*变量包含没有类型的内存地址(它没有方法,也可以指向基元),Object变量是引用到对象,它是Object类的一个实例或其中一个子类(因此有一些方法,多态性的可能性,并且不能引用基本类型)。

    比较可能意味着,如果在c ++中你想存储任何类的对象,你可以使用void*然后在评估时根据需要进行投射。通过这种方式,他们可以做同样的事情。

  2. 编译错误可能是由于您在创建列表后对列表所做的事情造成的,因为解释void*不能将其视为Object