编译器错误,因为构造函数必须显式初始化成员

TGa*_*Gar 3 c++ constructor compiler-errors class c++11

我有类CFirstCSecond.我对第二节课无能为力,但我可以用第一节课做点什么.
我试图从第一个中的第二个创建一个对象,但编译器仍然不满意.

到目前为止最好的是:

class CFirst{
    public:
    CSecond m_sec;
    CFirst ( const CSecond & sec ) {
          CSecond m_sec(sec.a(),sec.b());
     };

class CSecond{
    public:
    CSecond ( int a, int b) : m_A ( a ), m_B ( b ){ }
    int a  ( void ) const { return m_A;  }
    int b ( void ) const { return m_B; }
    private:
    int m_A;
    int m_B;
};
Run Code Online (Sandbox Code Playgroud)

但是编者说:

'CFirst'的构造函数必须显式初始化没有默认构造函数的成员'm_sec'.

你有什么建议吗?

编辑:

我也尝试过(没有成功)

 m_sec(sec.a(),sec.b());
Run Code Online (Sandbox Code Playgroud)

代替

 CSecond m_sec(sec.a(),sec.b());
Run Code Online (Sandbox Code Playgroud)

解释在下面的评论中回答.

son*_*yao 10

在构造函数内部CFirst,CSecond m_sec(sec.a(),sec.b());不初始化成员m_sec,而是定义具有名称的本地对象m_sec,该对象与成员无关m_sec.(它隐藏了会员m_sec.)

您应该使用成员初始化列表,例如

CFirst ( const CSecond & sec ) : m_sec(sec.a(), sec.b()) {} // initialize data member m_sec via CSecond::CSecond(int, int) 
Run Code Online (Sandbox Code Playgroud)

要么

CFirst ( const CSecond & sec ) : m_sec(sec) {} // initialize data member m_sec via CSecond's copy constructor 
Run Code Online (Sandbox Code Playgroud)

补充说明

非静态数据成员只能通过成员初始化列表或默认的初始化列表进行初始化(自C++ 11起).你不能在构造函数体内完成它.所以CSecond m_sec(sec.a(),sec.b());将定义一个新的局部变量,并且m_sec = sec;是一个赋值; 在赋值之前,我们m_sec试图默认初始化.但是CSecond没有默认构造函数,这会导致编译错误.

  • @TGar我添加了一些额外的解释. (2认同)