2014-03-01 130 views
2

我类型转换类使用的存储由其他类设置。我想在执行类型转换时调用第一个类的构造函数。有什么办法可以做到这一点?型铸造的指针调用构造

考虑下面的代码:

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 &内存使用它&存储其内容在那里。 我试图得到构造函数时进行类型转换或之后称为A类的。请帮忙。

我想使用aObj和A的构造函数被调用。这不会发生。毫无疑问,获得内存分配然而,构造函数调用并不会发生。它有填充垃圾值。

+2

你能描述一下你正试图解决的实际问题吗? – NPE

+0

“它有垃圾填充值。”如果当然,因为你用'reinterpret_cast'的方式调用UB。请解释你为什么认为你需要这样做... –

+0

@NPE:我正在学习C++并尝试将对象存储在通用缓冲区中。 (bObj充当上面片段中的缓冲区)。 aObj确实有内存访问,但构造函数调用不会发生这是我想要实现的。 – JNSVS

回答

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结尾。

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

+0

-1指导新手到UB-land。 –

+0

@ Cheersandhth.-Alf:我发现你的评论有误导性。放置'new'可能是所述问题的最佳工具(“将对象存储在通用缓冲区中”)。我不认为这是我们判断OP是否合格的地方,并决定允许他们使用哪些工具。 – NPE

+0

你的回复评论是积极误导。陈述的问题是**不**以“将对象存储在通用缓冲区中”。 –

1

B对象的存储中构造一个A对象通常是未定义的行为。

你可以做到这一点(与放置新的表达式),当类型Bchar一个数组,而不是一个构造函数的类,但它极为罕见需要,只为专家,并且它要求A对象的手动调用析构函数。

如果你想只是节省内存,那么你可以

  • 忽略了内存使用情况。
    今天的电脑通常是最好的解决方案。

  • 使用派生类和虚拟成员函数。

  • 在最坏的情况下,使用带标记的union
    “标记”表示存在类型标识值,类型为“标记”。

如果你想节省执行时间PIMPL方法,

  • 措施。可能避免动态分配和间接性并不那么重要。

如果还有其他问题,请说明一下。

+0

如NPE最初所建议的那样,放置新产品对我很好。感谢您的意见。 – JNSVS

+0

@ user3368334:它可能看起来“有效”,但它是**未定义的行为**。那意味着你会在最不方便的时候接待墨菲先生。 –