成员变量的新位置

时间:2017-04-25 09:09:32

标签: 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 */);
}

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

2 个答案:

答案 0 :(得分:2)

您在代码/* cannot construct the object here */中发表评论,但事实是在输入复合语句之前构建了成员

  

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

没有。在您可以使用placement new之前,必须首先销毁默认构造的成员 - 除非该成员是可以轻易破坏的。

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

UIElement init_uie(); // could be a member if needed
Element::Element() : uie(init_uie()) {

答案 1 :(得分:1)

一种选择是将初始化代码分解为:

Element::Element() : uie(get_uie()) {}

UIElement get_uie(){
    /* ... some aquiring ... */
    return UIElement(/* now I have the required data */);
}

你也可以在没有这样的额外功能的情况下进行内联,但可以说很难阅读:

Element::Element() : uie(
    []{
        /* ... some aquiring ... */
        return UIElement(/* now I have the required data */);
    }()
){}