分配不同的 class 对象时,分配未给出预期结果

Assignment is not giving expected result while assigning different class of objects

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

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

预期结果:
圆=6
盒子=0.7

根据下面的代码片段,赋值运算符负责初始化 Box 对象,以便可以将其分配给 Circle 对象。初始化后,Circleclass函数getAreaBoxCircleclass的成员)将调用getAreaboxBox的成员class) 以便在 Circle class 构造函数中获取当前设置的值。看起来赋值运算符内部没有发生正确的初始化,因此 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;
}

您的代码完全符合预期。你的期望是错误的。您期望 box = 0.7,但您用语句

覆盖了 box
circle=box;

复制构造函数破坏圆圈内的旧框并创建一个新框作为 'box' 的副本。 'box'有什么价值?

因为你在你的 main

中默认初始化 'box'
Box box;

默认为0,程序会在最后的cout语句中打印0。

cout << "box=" << circle.getAreaBox() << endl;

将打印圆圈内方框的值...已通过变量 'box'.

的复制构造函数初始化

如果将main中的变量'box'改成:

int main() {
  Box box(0.9);
...

输出将是:

circle=6, box=0.9

P.S。请不要使用指针 (Box*)。只是不要。请改用 std::shared_ptr<>。有很多好的网站解释了原因。您的 class 'circle' 有很多与指针相关的问题。您可以通过阅读

来提高您的编程技能
  • 悬挂指针
  • deep copy 对比 shallow copy
  • std::shared_ptr<>std::unique_ptr<>
  • 虚拟析构函数

玩得开心...

请查看下面link中我针对您的问题的解决方案。

http://coliru.stacked-crooked.com/a/1bfb63a8eedeefae

分辨率更新:

(1) 原始指针替换为智能指针。

(2) 复制赋值运算符替换为getObject方法,以便在构造函数中获取当前set Box class对象。

(3) 您不需要使用 box 对象构造函数再次设置当前值,因为它会选择在 Circle class 构造函数中设置的相同值。

(4) 不需要在 Circle 中单独使用方法 double getAreaBox() class 因此代码针对相同的方法进行了优化。

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