调用非默认构造函数作为成员初始化

Call non-default constructor as member initialization

提问人:Donut 提问时间:6/14/2018 最后编辑:songyuanyaoDonut 更新时间:6/14/2018 访问量:126

问:

我有一个类“A”和一个类“B”,使得 A 包含 B 的实例

class A
{
    B b = B(parameters...);
    Other thing = 3;
}

这段代码的问题在于 B 没有(也不应该!)有复制构造函数,所以编译器抱怨

我希望能够像下面这样调用 B 的构造函数,但它将其解释为函数声明

class A
{
    B b(parameters...);
    Other thing = 3;
}

有没有办法在类的定义中调用非默认构造函数?

C++ C++11 初始化 复制构造函数 default-constructor

评论

0赞 Barry 6/14/2018
在 C++17 中,你可以随心所欲地做。B b = B(parameters...);
0赞 Donut 6/15/2018
@Barry 很高兴知道!谢谢。可悲的是,我没有使用 C++17。

答:

2赞 songyuanyao 6/14/2018 #1

默认成员初始值设定项(因为 C++11)仅支持大括号或等于初始值设定项;您可以在此处使用大括号初始值设定项。

class A
{
    B b{parameters...};
    Other thing = 3;
};
1赞 dimo raichev 6/14/2018 #2

如果你需要使复制构造函数不可见,你可以让它private

Class B
{
     public:
     B(parameters...){};

     private:
     B(B b){};
}

至于你的代码,我认为你的问题是你需要在 A 的构造函数中启动成员,如下所示:

 class A
{
    A()
      : B(parameters...)
    {
        thing = 3;
    }

    B b;
    Other thing;
} 

评论

0赞 Serge Ballesta 6/14/2018
也许不那么现代,但仍然易于书写、阅读和理解。唯一的缺点是成员声明和构造函数中的初始化之间存在重复。在 C++11 中添加的原因...Other thing = 3;