使用 Sizeof、malloc 和 cast 的 C++ 对象实例化
c++ object instantiation using sizeof, malloc and cast
在Java中,我可以使用"Class"方法"newInstance"实例化一个对象,对于我的特定系统,我发现它确实非常有用。我现在正试图在C++实现类似的东西。
对我来说,如何实现这一目标并不明显,但经过一番思考......(你明白了吗...嗯?我认为可以通过创建一个 ClassDescription 类来实现,该类具有一个保存类实例的"sizeof"属性和一个方法 newInstance,该方法会恶意分配此内存量并将其作为 void * 返回。然后,调用代码需要适当地强制转换此代码。
C++语言是否恰当地定义了这是否有效?
顺便一提。。我认识到我可以创建一个注册表,为类保存工厂,这是一个备份计划。对于这个问题的答案,我重视关注我所讨论的内容是否有效的具体问题。
此致敬意
*附加背景 *此要求的原因是允许泛型库实例化库用户知道的类,但不允许库本身。库将有一些元数据用于实现此目的,因此可以告诉类的大小。从用户的角度来看,不必将工厂对象添加到元数据中是"更整洁的"。
这在某些情况下是有效的。要求是类型必须是"纯旧数据类型"(POD((另请参阅此答案(。如果它有任何更复杂的东西(例如虚拟成员函数,具有虚拟成员函数的成员,基类也必须是 POD 等(,那么它将不起作用并且是未定义的行为。
您可以通过执行以下操作来检查类型是否满足这些要求:
#include <type_traits>
static_assert(std::is_pod<A>::value, "A must be a POD type.");
一般来说,这可能表明你做错了。C++不是Java,可能有更好的方法来解决潜在的实际问题。
malloc 和 cast 方法中缺少的是对象的构造。使用 new
既可以分配内存,也可以构造内存。这包括构建V表、调用构造函数等。类型转换 malloc 分配的内存无效。
请注意,malloc
正确大小的内存块只会为您提供原始内存。您需要在此内存块中构造所需类的对象。这可以通过放置 new 来实现。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- 使用"std::unordereded_map"映射到"std::list"对象