向另一个类的构造函数传递对象引用时出现编译错误
问题分析与解决方案
这个报错的核心原因很明确:类x没有默认构造函数,而类y的构造函数没有在初始化列表中正确初始化x类型的成员temp。
为什么会报错?
当你定义了类的自定义构造函数(比如x(int a, int b)),C++编译器就不会自动生成默认构造函数(也就是不带参数的x())。而在y的构造函数执行流程中,成员变量temp会在构造函数体代码执行之前被初始化:
- 你的代码里没有在
y的构造函数初始化列表中指定temp的初始化方式,编译器会尝试调用x的默认构造函数来创建temp; - 但
x没有默认构造函数,所以编译器就抛出了no matching function to call x::x()的错误。 - 至于你在构造函数体内写的
this->temp = o;,这是赋值操作,不是初始化,这一步已经是在temp尝试初始化失败之后了,根本没机会执行。
两种解决方法
方法一:给类x添加默认构造函数
直接为x补充一个不带参数的默认构造函数,这样编译器就能正常初始化y的temp成员了:
#include <iostream> using namespace std; class x{ public: x() {} // 添加默认构造函数 x(int a, int b) { cout << a << b;} }; class y{ x temp; public: y(x& o){ this->temp = o;} };
方法二:使用构造函数初始化列表初始化temp
这是更推荐的C++写法,直接在y的构造函数初始化列表中调用x的拷贝构造函数(编译器会自动生成拷贝构造函数,因为你没自定义)来初始化temp,完全绕开默认构造的问题:
#include <iostream> using namespace std; class x{ public: x(int a, int b) { cout << a << b;} }; class y{ x temp; public: y(x& o) : temp(o) {} // 初始化列表初始化temp };
内容的提问来源于stack exchange,提问作者Nilesh Kumar
相关产品推荐
相关产品推荐

