You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向另一个类的构造函数传递对象引用时出现编译错误

问题分析与解决方案

这个报错的核心原因很明确:类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:44:15