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

时间:2017-04-09 11:14:49

标签: c++ class c++11 constructor compiler-errors

我有课程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;
};

但是编者说:

  'CFirst'的

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

你有什么建议吗?

编辑:

我也尝试过(没有成功)

 m_sec(sec.a(),sec.b());

而不是

 CSecond m_sec(sec.a(),sec.b());

解释见下面的评论。

1 个答案:

答案 0 :(得分:10)

CFirst的构造函数中,CSecond m_sec(sec.a(),sec.b());不初始化成员m_sec,而是定义名为m_sec的本地对象,该对象与成员m_sec。 (它隐藏了成员m_sec。)

您应该使用member intializer list代替,例如

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

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

其他说明

Non-static data members只能通过成员初始化列表或默认的初始化列表进行初始化(自C ++ 11起)。你不能在构造函数体内完成它。因此CSecond m_sec(sec.a(),sec.b());将定义一个新的局部变量,m_sec = sec;是一个赋值;在作业m_sec被诱惑为默认初始化之前。但是CSecond没有默认构造函数,这会导致编译错误。