在下面的代码片段中,我通过赋值运算符将Box
类型的对象分配到Circle
类型的对象中,但我无法获得预期的结果。
当前执行结果:
圆= 6
box = 0
预期结果:
圆= 6
盒= 0.7
根据下面的代码片段,赋值运算符负责初始化Box
对象,以便将其分配给Circle
对象。初始化后,Circle
类函数getAreaBox
(Circle
类的成员)将调用getAreabox
(Box
类的成员)以获取当前在Circle
类构造函数中设置值。看起来在赋值运算符中没有进行正确的初始化,因此getAreabox
函数不会返回预期的值。
#include <iostream>
using namespace std;
class Box
{
private:
double area;
public:
Box(double areaval=0.0)
{
area=areaval;
}
double getAreabox() const
{
return area;
}
};
class Circle
{
private:
int area;
Box *box;
public:
Circle(int areaval=0,double boxval=0.0):area(areaval)
{
box= new Box(boxval);
}
const Circle& operator =(const Box& obj)
{
if(&obj!=box)
{
delete box;
box= new Box (obj);
}
return *this;
}
int getAreaCircle()
{
return area;
}
double getAreaBox()
{
double val=box->getAreabox();
return val;
}
~Circle(){delete box;}
};
int main() {
Box box;
Circle circle(6,0.7);
cout<<"circle="<<circle.getAreaCircle()<<endl;
circle=box;
cout<<"box="<<circle.getAreaBox()<<endl;
return 0;
}
答案 0 :(得分:1)
您的代码完全按照预期执行。你的期望是错误的。您希望box = 0.7,但是用语句
覆盖框circle=box;
复制构造函数会破坏圆圈内的旧框并创建一个新框作为“框”的副本。什么价值&#39; box&#39;有?
由于您默认初始化&#39;框&#39;在你的主要
Box box;
且默认值为0,程序将在最后一个cout语句中打印0。
cout << "box=" << circle.getAreaBox() << endl;
将打印圆圈内的框的值...已经通过复制构造函数从变量&#39;框中初始化。
如果您更改变量&#39;框&#39;主要是:
int main() {
Box box(0.9);
...
输出将是:
circle=6, box=0.9
P.S。请不要使用指针(Box*
)。只是不要。请改用std::shared_ptr<>
。有很多好的网站解释原因。你的班级圈子&#39;有很多指针相关的问题。您可以通过阅读
deep copy
与shallow copy
std::shared_ptr<>
和std::unique_ptr<
&gt; 玩得开心......
答案 1 :(得分:1)
请在下面的链接中查看我的解决方案,以解决您的问题。
http://coliru.stacked-crooked.com/a/1bfb63a8eedeefae
分辨率更新:
(1)原始指针被智能指针替换。
(2)用getObject方法替换复制赋值运算符,以便在构造函数中获取当前设置的Box类对象。
(3)您不需要使用框对象构造函数再次设置当前值,因为它将在Circle类构造函数中选择相同的值集。
(4)不需要在Circle类中单独使用方法double getAreaBox(),因此代码针对相同进行了优化。
我希望这个解决方案可以满足您的需求。