我有一个具有 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 类的构造已经分配的空间中?

最佳答案

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



不。默认构造的成员必须首先被销毁,然后才能使用新的放置 - 除非该成员是微不足道的可破坏的。

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

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

关于c++ - 成员变量的新位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43606273/

10-15 18:03