C++中不同类对象赋值未达预期,求代码问题排查
问题分析与解决方案
咱们来拆解一下你遇到的问题:执行circle=box;后,circle.getAreaBox()返回0而不是你预期的0.7,核心问题出在Circle类的赋值运算符实现上。
问题根源
你的operator=(const Box&)里有两个关键错误:
- 错误的条件判断:你写的
if(&obj!=box)是在对比传入的Box对象地址(比如main里栈上的那个box)和Circle成员box指针指向的堆内存地址。这俩地址永远不可能一样(一个在栈,一个在堆),所以每次赋值都会触发delete box和new Box(obj)的操作。 - 不符合预期的对象替换:新建的
Box对象是用main里默认构造的box(它的area是0.0)拷贝来的,直接覆盖了原来构造Circle时创建的Box(0.7),所以后续调用getAreaBox()自然返回0.0。
针对你预期结果的修改方案
你的预期是执行赋值后,circle的area还是6,box的area保持0.7,可以按以下方式调整:
方案1:让赋值运算符不修改任何状态
如果你只是想保留Circle原有的状态,不需要通过赋值改变它,那可以简化赋值运算符:
const Circle& operator =(const Box& obj) { // 啥也不做,直接返回当前对象 return *this; }
这样执行circle=box;后,Circle的所有成员都会保持构造时的初始值,正好符合你的预期结果。
方案2:移除不必要的赋值操作
如果circle=box;这行代码不是必须的,直接删掉它也能得到你想要的结果——毕竟这行代码本来就是在修改Circle的状态,而你并不希望它被修改。
额外的优化建议
另外,你的Circle类还存在浅拷贝风险:如果拷贝Circle对象(比如Circle c2 = circle;),两个对象会共享同一个box指针,析构时会重复删除同一块内存导致崩溃。建议遵循C++的三/五法则,补充拷贝构造函数和拷贝赋值运算符:
// 拷贝构造函数:深拷贝Box对象 Circle(const Circle& other) : area(other.area) { box = new Box(*other.box); } // 拷贝赋值运算符 Circle& operator=(const Circle& other) { if (this != &other) { area = other.area; delete box; box = new Box(*other.box); } return *this; }
内容的提问来源于stack exchange,提问作者user2907032
相关产品推荐
相关产品推荐

