如何在C++中使用包含其他类对象的构造函数?附代码问题求助
修正你的C++类组合代码问题
嗨,刚接触C++面向对象编程遇到这类构造函数的问题很正常,我帮你梳理代码里的几个错误点,然后给出可以正常运行的完整实现:
代码里的核心问题
- 类声明顺序错误:Person类中包含Hat类型的成员
myHat,但你先定义了Person再定义Hat,编译器在处理Person时还不知道Hat是什么类型,会直接报错。 - 构造函数参数不匹配:你声明的Person构造函数需要三个参数(string、unsigned int、Hat),但定义时只写了两个参数,而且函数里用到的
hat变量根本没声明。 - 成员初始化方式错误:你尝试在构造函数体内给
myHat赋值,但此时myHat会被强制调用默认构造函数(而Hat并没有默认构造函数),这会触发编译错误;正确的做法是用构造函数初始化列表直接初始化成员。 - display方法调用错误:Person的display里调用
hat.display(),但你的Person成员变量是myHat,名称不匹配。 - 缺少必要头文件:代码用到了
std::string和std::cout,必须包含<iostream>和<string>头文件才能正常编译。
修正后的完整代码
#include <iostream> #include <string> // 先定义Hat类,确保Person能识别它 class Hat { private: std::string hatType; char hatSize; // 取值为S、M、L public: Hat(std::string, char); void display(); }; // 使用初始化列表初始化Hat的成员变量 Hat::Hat(std::string _type, char _size) : hatType(_type), hatSize(_size) {} void Hat::display() { std::cout << "Hat type : " << hatType << std::endl; std::cout << "Hat size : " << hatSize << std::endl; } // 再定义Person类 class Person { private: std::string name; unsigned int idNum; Hat myHat; public: Person(std::string, unsigned int, Hat); void display(); }; // 补全构造函数参数,并用初始化列表初始化所有成员 Person::Person(std::string personName, unsigned int personID, Hat personHat) : name(personName), idNum(personID), myHat(personHat) {} void Person::display() { std::cout << "Given name : " << name << std::endl; std::cout << "Id. number : " << idNum << std::endl; // 调用正确的成员变量myHat的display方法 myHat.display(); } int main() { Person personA("Alice", 12321, Hat("Trilbee", 'M')); Person personB("Bob", 2324, Hat("Ferret", 'S')); personA.display(); std::cout << "\n------------------------\n" << std::endl; // 分隔两个对象的输出,可读性更好 personB.display(); return 0; }
运行输出
Given name : Alice Id. number : 12321 Hat type : Trilbee Hat size : M ------------------------ Given name : Bob Id. number : 2324 Hat type : Ferret Hat size : S
额外说明
- 如果你觉得
std::前缀太繁琐,可以在头文件下面添加using namespace std;,这样就不用每次都写std::了,但在大型项目中不推荐这种做法,新手阶段可以尝试两种方式来熟悉命名空间的概念。 - 构造函数初始化列表是C++中初始化类成员的首选方式,尤其是对于类类型成员(比如这里的
myHat),它能避免不必要的默认构造和赋值操作,效率更高。
内容的提问来源于stack exchange,提问作者Damon O'Neil
相关产品推荐
相关产品推荐

