使用 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 的指针意味着您拥有某物的内存地址,但您不知道它是什么类型。您可以使用任何类型的指针创建向量,然后当您将项目添加到向量时,您可以将指针转换为您在向量声明中使用的任何指针。这是骗人的,但它会在语法上起作用。不利的一面是您不知道向量中有哪些数据项。
你在这两点上都是对的。
void*
不是 Object
.
的 C++ 等价物
C++ 中没有等效项。
- 您以错误的方式使用它 – 您取消引用向量中的元素。
不可能就您应该做什么提供任何建议,因为您没有提供任何关于您想要完成的事情的信息。
A Java Object
是一个基本基础 -class 为所有 Java class 提供了一些共同的属性。
C++中没有这样的东西。如果要设计多态层次,你自己设计base-classMyBaseClass
(抽象与否),然后设计derivedclasses.
因此,创建vector<void*>
容器在技术上是可行的,但没有意义。对于正确的软件设计,您想要的是设计您的基础-class MyBaseClass
,以便您能够创建 vector<MyBaseClass*>
个容器。
void*
对比 Object
。这些当然不是等价物,void*
变量包含没有类型的内存地址(它没有方法,也可以指向原语),Object
变量是 reference 到对象,它是 Object
class 或其子 class 之一的实例(所以有一些方法,多态性的可能性,并且不能引用原始类型).
比较的意思可能是,如果在 c++ 中你想存储 any class 的对象,你会使用 void*
然后评估时根据需要进行投射。通过这种方式,他们可以做一些相同的事情。
编译错误可能是由于您在创建列表后对它所做的操作引起的,因为如前所述,void*
不能像 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 的指针意味着您拥有某物的内存地址,但您不知道它是什么类型。您可以使用任何类型的指针创建向量,然后当您将项目添加到向量时,您可以将指针转换为您在向量声明中使用的任何指针。这是骗人的,但它会在语法上起作用。不利的一面是您不知道向量中有哪些数据项。
你在这两点上都是对的。
void*
不是Object
.
的 C++ 等价物 C++ 中没有等效项。- 您以错误的方式使用它 – 您取消引用向量中的元素。
不可能就您应该做什么提供任何建议,因为您没有提供任何关于您想要完成的事情的信息。
A Java Object
是一个基本基础 -class 为所有 Java class 提供了一些共同的属性。
C++中没有这样的东西。如果要设计多态层次,你自己设计base-classMyBaseClass
(抽象与否),然后设计derivedclasses.
因此,创建vector<void*>
容器在技术上是可行的,但没有意义。对于正确的软件设计,您想要的是设计您的基础-class MyBaseClass
,以便您能够创建 vector<MyBaseClass*>
个容器。
void*
对比Object
。这些当然不是等价物,void*
变量包含没有类型的内存地址(它没有方法,也可以指向原语),Object
变量是 reference 到对象,它是Object
class 或其子 class 之一的实例(所以有一些方法,多态性的可能性,并且不能引用原始类型).比较的意思可能是,如果在 c++ 中你想存储 any class 的对象,你会使用
void*
然后评估时根据需要进行投射。通过这种方式,他们可以做一些相同的事情。编译错误可能是由于您在创建列表后对它所做的操作引起的,因为如前所述,
void*
不能像Object
那样处理。