0

在 Java 中,我可以使用“类”方法“newInstance”来实例化一个对象,这对我的特定系统来说确实很有帮助。我现在正试图在 C++ 中实现类似的东西。

对我来说,如何实现这一点并不明显,但经过一些思考......(你明白了吗......嗯?)我认为通过创建一个具有保存属性的 ClassDescription 类可能是可能的 ' sizeof' 类实例和一个方法 newInstance,该方法分配此内存量并将其作为 void * 返回。然后调用代码将需要适当地转换它。

C++ 语言是否适当地定义了这是否有效?

顺便说一句..我认识到我可以为作为备份计划的类创建一个包含工厂的注册表。对于这个问题的答案,我会重视关注我所讨论的内容是否有效的具体问题。

此致

*附加上下文* 此要求的原因是允许通用库实例化库用户知道但不知道库本身的类。该库将有一些元数据用于实现此目的,因此可以告知类的大小。从用户的角度来看,不必将工厂对象添加到元数据中会更“整洁”。

4

3 回答 3

4

这在某些情况下是有效的。要求是类型必须是“普通旧数据类型”(POD)另请参见此答案)。如果它有更复杂的东西(例如虚拟成员函数、具有虚拟成员函数的成员、基类也必须是 POD 等),那么它将无法工作并且是未定义的行为。

您可以通过执行以下操作检查类型是否满足这些要求

#include <type_traits> 

static_assert(std::is_pod<A>::value, "A must be a POD type.");

一般来说,虽然它可能表明你做错了。C++ 不是 Java,可能有更好的方法来解决潜在的实际问题。

于 2012-05-08T09:49:28.837 回答
2

malloc 和 cast 方法中缺少的是对象的构造。使用new两者分配内存并构造它。这包括构建 v-tables、调用构造函数等等。类型转换 malloc 分配的内存无效。

于 2012-05-08T09:49:35.343 回答
0

请注意,malloc选择正确大小的内存块只会为您提供原始内存。您需要在此内存块中构造所需类的对象。这可以使用placement new来实现。

于 2012-05-08T09:52:41.457 回答