我正在输入一个类来使用另一个类设置的存储。我想在执行类型转换时调用第一个类的构造函数。有没有办法实现这个目标?
请考虑以下代码:
class A{
int x;
public:
A() {x = 0;}
};
class B{
double x;
public:
B() {x =0.0f;}
};
B * bObj = new();
A * aObj = reinterpret_cast < A * > ( bObj ); //Just for the sake of explaining
现在 aObj 引用分配给 bObj的内存&amp;使用它&amp;将其内容存储在那里。 我正在尝试在执行类型转换时或之后调用构造函数。请帮忙。
我想使用 aObj 并调用A的构造函数。这不会发生。毫无疑问, aObj 会分配内存,但构造函数调用不会发生。它填充了垃圾值。
答案 0 :(得分:1)
在A
对象的存储中构造B
对象通常是未定义的行为。
当B
类型是char
的数组时,你可以这样做(使用展示位置新表达式),而不是带有构造函数的类,但它极少需要,仅适用于专家,并且它需要手动调用A
对象的析构函数。
如果您只是想节省内存,那么可以
忽略内存使用情况。
今天的计算机通常是最好的解决方案。
使用派生类和虚拟成员函数。
在最糟糕的情况下,请使用标记为union
“标记”表示存在类型标识值,类型“标记”。
如果您正在尝试节省PIMPL习惯用法的执行时间,
如果还有别的,请说清楚。
答案 1 :(得分:0)
我正在学习C ++并尝试将对象存储在通用缓冲区中。 (bObj充当上述代码段中的缓冲区)。 aObj确实有内存访问,但构造函数调用不会发生,这是我想要实现的。
听起来您需要阅读展示位置new
。有关使用的背景和示例,请参阅What uses are there for "placement new"?和What is "placement new" and why would I use it?。
请注意,正确使用展示位置new
需要谨慎。很容易弄错,最终得到undefined behaviour。
特别是,您需要重新考虑如何分配缓冲区。