类中实例化Rect对象报错:默认构造函数缺失及未解析外部符号问题
问题解决思路
为啥一开始编译报错?
你写的Rect类只定义了带参数的构造函数,C++里只要自定义了构造函数,编译器就不会自动生成无参的默认构造函数。而Brick类里的floatRect是Rect类型的成员,在Brick构造函数执行前,这个成员会先被初始化,此时需要调用Rect的无参构造,但你没提供,所以编译器直接报错要求默认构造函数。
加了默认构造为啥又出链接错误?
这个错误通常是代码没被正确编译链接:要么是Rect的实现(如果有单独的.cpp文件)没加到项目中,要么是编译时遗漏了对应的源文件,导致链接器找不到Rect构造函数等成员的实际定义。
两种正确的解决办法
办法1:用成员初始化列表直接初始化Rect(推荐)
不用给Rect加默认构造,直接在Brick的构造函数里用初始化列表调用Rect的带参构造,一步到位初始化成员,还能省掉create函数的冗余调用:
修改Brick.h:
#pragma once #include "Rect.h" class Brick { private: Rect floatRect; public: Brick() : floatRect(28) {} // 用初始化列表直接初始化Rect对象 };
Rect.h保持原样即可,这样编译不会再要求默认构造,逻辑也更清晰。
办法2:给Rect加默认构造并确保编译链接正常
如果你非要保留create函数的用法,那就给Rect加个默认构造,同时保证代码能被正确编译:
修改Rect.h:
#pragma once class Rect { private: int m_Thing; public: Rect() : m_Thing(0) {} // 添加无参构造,初始化m_Thing为0 Rect(int thing) : m_Thing(thing) {} // 建议改用初始化列表,比构造函数内赋值更高效 void create(int thing) { m_Thing = thing; } };
然后检查:
- 如果
Rect的代码都在.h文件里,确保所有包含Rect.h的源文件都能正常编译 - 如果
Rect有对应的.cpp文件,一定要把这个文件加到你的项目编译列表里,避免链接器找不到函数实现
额外优化建议
尽量用成员初始化列表初始化类成员,别在构造函数体内赋值,这是C++里更高效、更规范的写法;另外create这类初始化函数其实没必要,直接用构造函数完成初始化就好,减少多余操作。
内容的提问来源于stack exchange,提问作者Elijah Campbell
相关产品推荐
相关产品推荐

