成员变量的新放置

Mar*_* B. 5 c++

我有一个具有 GUI 成员变量的类。我必须在构建时提供文本、字体和大小。不幸的是,所属类的构造函数无法获取提供的数据,而是必须从工厂获取它(尤其是字体)。

class Element {
public:
    Element();
    /* other stuff */

private:
    UIElement uie;
};

Element::Element() /* cannot construct the object here */ {
    /* ... some aquiring ... */
    new (&uie) UIElement(/* now I have the required data */);
}
Run Code Online (Sandbox Code Playgroud)

这是一个有效的实施吗?我可以简单地将对象放入类的构造已经分配的空间中吗Element

eer*_*ika 3

您在代码中进行了注释/* cannot construct the object here */,但事实是该成员在输入复合语句之前构造的。

这是一个有效的实施吗?我可以简单地将对象放入 Element 类的构造已经分配的空间中吗?

不可以。在使用新的放置之前,必须首先销毁默认构造的成员 - 除非该成员是可轻易破坏的。

然而,这是毫无意义的。无论您在复合语句中可以做什么,您也可以在初始化列表中做什么。如果一个表达式不够,那么您可以简单地编写一个单独的函数,然后调用它。

UIElement init_uie(); // could be a member if needed
Element::Element() : uie(init_uie()) {
Run Code Online (Sandbox Code Playgroud)