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

C++类内存储同类型类引用时报operator=为已删除函数如何解决

报错原因

  • 你的类中定义了引用类型成员Person& them,C++ 规定:如果类包含引用类型的非静态成员,编译器会自动删除默认生成的拷贝赋值运算符operator=,因为引用一旦完成初始化后就无法重新绑定,默认赋值逻辑无法处理这种场景,所以你尝试执行them = they.giveYourself()时,就会触发已删除函数的报错。
  • 除此之外,引用类型成员必须在类构造函数的初始化列表中完成初始化,你当前的类没有自定义构造函数,them成员本身处于未初始化的非法状态,哪怕没有赋值操作,这个类的定义本身就不合法。
  • 额外逻辑问题:giveYourself()返回的是*this的拷贝值(临时对象),你就算赋值成功也是把临时对象的值覆盖到them原本绑定的对象,根本达不到「存储另一个Person对象引用」的需求。

修复方案

如果你需要后期可以修改指向的其他Person对象,把引用成员换成指针即可,这是最通用的方案:

class Person {
private:
    // 换成指针,支持后期修改指向
    Person* them = nullptr;
    int number = 0; // 基础类型成员建议给默认值避免未初始化
public:
    // 返回自身引用避免不必要的拷贝
    Person& giveYourself(){
        return *this;
    }
    int giveNumber(){
        return number;
    }
    void getThem(Person& they){
        // 直接存储目标对象的地址即可
        them = &they.giveYourself();
    }
};

如果你确定them的绑定关系在对象生命周期内不会修改,可以保留引用,但必须在构造阶段就完成初始化:

class Person {
private:
    Person& them;
    int number;
public:
    // 必须自定义构造函数,在初始化列表完成引用成员的初始化
    Person(Person& ref, int num = 0) : them(ref), number(num) {}
    
    Person& giveYourself(){
        return *this;
    }
    int giveNumber(){
        return number;
    }
    // 该场景下无法实现修改them的接口,因为引用不支持重绑定
};

内容的提问来源于stack exchange,提问作者g0x0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:21:00