在分配不同类别的对象时,赋值不会给出预期的结果

时间:2018-05-10 09:33:42

标签: c++ operator-keyword assignment-operator

在下面的代码片段中,我通过赋值运算符将Box类型的对象分配到Circle类型的对象中,但我无法获得预期的结果。

当前执行结果:
圆= 6
box = 0

预期结果:
圆= 6
盒= 0.7

根据下面的代码片段,赋值运算符负责初始化Box对象,以便将其分配给Circle对象。初始化后,Circle类函数getAreaBoxCircle类的成员)将调用getAreaboxBox类的成员)以获取当前在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;
}

2 个答案:

答案 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 copyshallow 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(),因此代码针对相同进行了优化。

我希望这个解决方案可以满足您的需求。