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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:04:52