【问题标题】:Assignment is not giving expected result while assigning different class of objects分配不同类别的对象时,分配没有给出预期的结果
【发布时间】:2018-05-10 09:33:42
【问题描述】:

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

当前执行结果:
圆=6
盒子=0

预期结果:
圆=6
框=0.7

按照下面的代码 sn-p,赋值运算符负责初始化 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;
}

【问题讨论】:

  • 因此,当您将 Box box; 替换为 Box box(0.8); 时,您会注意到它打印出 box=0.8 您的赋值运算符似乎完全按照您的要求进行操作
  • 我认为你应该澄清为什么你认为预期的输出是 box=0;但在您这样做之前,请使用调试器逐步完成所有操作。
  • 发帖时请注意问题预览;代码缩进一团糟。
  • 代码通过 ctrl+k 缩进
  • 不幸的是,快捷方式并不神奇,尤其是不能很好地与选项卡配合使用。请随时查看问题预览。

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


【解决方案1】:

请在下面的链接中查看我的解决方案以解决您的问题。

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

分辨率更新:

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

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

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

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

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

【讨论】:

  • 感谢您的回答。我已经根据我的要求稍微定制了您的解决方案。下面是相同的链接,所以现在甚至不需要在主函数中创建空框对象,除此之外我想继续使用 getAreaBox 函数,这样我就可以用 Circle 类对象实例化这个方法。 coliru.stacked-crooked.com/a/b823ba2690590454
  • 同意你的看法:)。我们不应该在主函数本身中公开 Box 对象,因为它看起来不太好,因为 Circle 对象已经有责任初始化相同的对象,并且默认值初始化已经在 Box 类本身中完成。
【解决方案2】:

您的代码完全按照它应该做的。你的期望是错误的。你期望 box = 0.7,但你用语句覆盖了 box

circle=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

附:请不要使用指针 (Box*)。只是不要。请改用std::shared_ptr&lt;&gt;。有很多很好的网站解释了原因。你的类'circle'有很多与指针相关的问题。你可以通过阅读来提高你的编程技能

  • 悬空指针
  • deep copyshallow copy
  • std::shared_ptr&lt;&gt;std::unique_ptr&lt;>
  • 虚拟析构函数

玩得开心……

【讨论】:

  • 感谢您的回答和建议。在 Circle 类析构函数中,我已经删除了 box 对象。您能否通过一些观察到指针相关问题的地方来了解一下。
猜你喜欢
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2023-03-03
相关资源
最近更新 更多