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
相关产品推荐
相关产品推荐

