键入casted指针构造函数调用

时间:2014-03-01 14:17:12

标签: c++ constructor casting

我正在输入一个类来使用另一个类设置的存储。我想在执行类型转换时调用第一个类的构造函数。有没有办法实现这个目标?

请考虑以下代码:

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 会分配内存,但构造函数调用不会发生。它填充了垃圾值。

2 个答案:

答案 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

特别是,您需要重新考虑如何分配缓冲区。