C++入门:如何在一个类中使用带构造函数的其他类?
解决C++中类包含带参数构造函数的成员类的编译错误
嘿,我来帮你搞定这个编译错误!问题出在你对MyMachine里的component成员的声明方式上,咱们一步步拆解:
为什么会报错?
你在MyMachine类里写了:
MyComponent component(int id);
这行代码不是在声明成员变量,而是被编译器解析成了一个成员函数:它的名字是component,返回类型是MyComponent,参数是一个int类型的id。所以后面你试图访问component._id或者调用component.getId()时,编译器会认为你在错误地使用一个成员函数(忘记加括号调用),自然就抛出编译错误了。
正确的实现方式
当你的成员类(MyComponent)只有带参数的构造函数、没有默认构造函数时,必须在包含类(MyMachine)的构造函数初始化列表中完成成员对象的初始化,这是C++的规定。
方案1:固定参数初始化成员对象
修改MyMachine的代码如下:
/********************************************* * MyMachine *********************************************/ // MyMachine.h class MyMachine { private: MyComponent component; // 正确声明成员变量,不是函数 public: MyMachine(); void printComponentInfo(); }; // 使用初始化列表初始化component,传入固定的id值 MyMachine::MyMachine() : component(123456) { // 这里不需要再给component._id赋值了,因为构造函数已经完成初始化 } void MyMachine::printComponentInfo() { int id = component.getId(); std::cout << id << "\n"; }
方案2:动态传递参数初始化
如果你希望在创建MyMachine对象时,动态指定MyComponent的id,可以修改MyMachine的构造函数接收参数:
/********************************************* * MyMachine *********************************************/ // MyMachine.h class MyMachine { private: MyComponent component; public: MyMachine(int componentId); // 新增参数接收component的id void printComponentInfo(); }; // 把传入的参数传递给component的构造函数 MyMachine::MyMachine(int componentId) : component(componentId) { } void MyMachine::printComponentInfo() { int id = component.getId(); std::cout << id << "\n"; } /********************************************* * Main *********************************************/ int main() { MyMachine machine(123456); // 创建时传入id machine.printComponentInfo(); return 0; }
关键知识点总结
- 当成员类没有默认构造函数时,必须在包含类的构造函数初始化列表中初始化成员对象,不能在构造函数体内直接赋值(因为编译器无法默认构造该对象)。
- 区分成员变量和成员函数的声明:
MyComponent component;是成员变量声明,MyComponent component(int);是成员函数声明,不要混淆。
内容的提问来源于stack exchange,提问作者Phoax
相关产品推荐
相关产品推荐

