我有课程CFirst
和CSecond
。
我对第二节课无能为力,但我可以用第一节课做点什么
我试图从第一个中的第二个创建一个对象,但编译器仍然不满意。
目前为止最好的是:
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());
解释见下面的评论。
答案 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
没有默认构造函数,这会导致编译错误。