使用 void* 作为 C++ 等效的 Java 对象

Using void* as C++ equivalent of Java Object

我正在尝试创建一个 class,其中包含一个 std::vector of void*。有人告诉我,void* 是等同于 Java 中的 Object 的 C++。由于这是用 Java 编写的程序的 C++ 端口,理论上它应该可以工作。

Java:

ArrayList<Object> list;

C++:

vector<void*> list;

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

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

指向 void 的指针意味着您拥有某物的内存地址,但您不知道它是什么类型。您可以使用任何类型的指针创建向量,然后当您将项目添加到向量时,您可以将指针转换为您在向量声明中使用的任何指针。这是骗人的,但它会在语法上起作用。不利的一面是您不知道向量中有哪些数据项。

你在这两点上都是对的。

  1. void* 不是 Object.
    的 C++ 等价物 C++ 中没有等效项。
  2. 您以错误的方式使用它 – 您取消引用向量中的元素。

不可能就您应该做什么提供任何建议,因为您没有提供任何关于您想要完成的事情的信息。

A Java Object 是一个基本基础 -class 为所有 Java class 提供了一些共同的属性。

C++中没有这样的东西。如果要设计多态层次,你自己设计base-classMyBaseClass(抽象与否),然后设计derivedclasses.

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

  1. void* 对比 Object。这些当然不是等价物,void* 变量包含没有类型的内存地址(它没有方法,也可以指向原语),Object 变量是 reference 到对象,它是 Object class 或其子 class 之一的实例(所以有一些方法,多态性的可能性,并且不能引用原始类型).

    比较的意思可能是,如果在 c++ 中你想存储 any class 的对象,你会使用 void* 然后评估时根据需要进行投射。通过这种方式,他们可以做一些相同的事情。

  2. 编译错误可能是由于您在创建列表后对它所做的操作引起的,因为如前所述,void* 不能像 Object 那样处理。