如何在C++类中正确调用另一个类的构造函数初始化成员?
C++构造函数初始化成员变量报错问题解答
先看你的代码:
class first{ private: second secondAvl; public: first():second(-1){} // 此处报错 }; class second: public Tree{ public: second(int key) :Tree(NULL, key){} // 此处调用Tree构造函数成功 };
你遇到的错误是:
no matching function for call to 'second::second()'
我来给你拆解问题出在哪:
核心原因:构造函数的初始化规则
在C++里,当你给一个类自定义了带参数的构造函数之后,编译器就不会再自动给这个类生成默认的无参构造函数了。你的second类就是如此——你写了second(int key)这个带参构造,所以second没有无参构造函数。
而你的first类里有一个second类型的成员变量secondAvl,当创建first对象时,编译器会先尝试初始化这个成员变量:
- 如果你在
first的构造函数初始化列表里没有明确指定secondAvl的初始化方式,编译器会自动调用second的无参构造函数; - 你现在写的
first():second(-1){}是错误的写法——这里的second(-1)是试图创建一个second临时对象,完全没关联到成员变量secondAvl,所以编译器还是会尝试去调用second的无参构造,自然就报错了。
为什么second调用Tree的构造能成功?
因为second的构造函数初始化列表里,明确指定了调用Tree的带参构造Tree(NULL, key),编译器就不会去尝试调用Tree的无参构造(哪怕Tree没有无参构造也没关系)。这是正确初始化基类的方式。
解决方法
把first的构造函数改成正确的初始化列表写法,明确初始化成员变量secondAvl:
class first{ private: second secondAvl; public: first():secondAvl(-1){} // 这里改成成员变量名secondAvl,而非类名second };
这样就会调用second的带参构造函数来初始化secondAvl,错误就消失啦。
内容的提问来源于stack exchange,提问作者user7886490
相关产品推荐
相关产品推荐

