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

类中实例化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:55:37