Назначение не дает ожидаемого результата при назначении другого класса объектов - PullRequest
0 голосов
/ 10 мая 2018

В приведенном ниже фрагменте кода я присваиваю объект типа Box объекту типа Circle через оператор присваивания, но не могу получить ожидаемый результат.

Текущее выполнениерезультат:
круг = 6
поле = 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;
}

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Пожалуйста, посмотрите мое решение в приведенной ниже ссылке для решения вашей проблемы.

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

обновление разрешения:

(1) Необработанный указатель заменяется умными указателями.

(2) оператор присвоения копии заменяется методом getObject, чтобы получить объект класса текущего набора Box внутри конструктора.

(3) Вам не нужно снова устанавливать текущее значение с помощью конструктора объекта box, так как оно выберет то же значение, которое установлено в конструкторе класса Circle.

(4) Нет необходимости иметь метод double getAreaBox () отдельнов классе Circle, поэтому код оптимизирован для того же.

Я надеюсь, что это решение позаботится о вашей необходимости.

0 голосов
/ 10 мая 2018

Ваш код делает именно то, что должен. Ваши ожидания неверны. Вы ожидаете box = 0,7, но вы перезаписываете поле с заявлением

circle=box;

Конструктор копирования разрушает старый прямоугольник внутри круга и создает новый как копию «прямоугольника». Какое значение имеет «коробка»?

Так как вы по умолчанию инициализируете 'box' в вашем основном

Box box;

и по умолчанию 0, программа выведет 0 в последнем выражении cout.

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

напечатает значение поля внутри круга ... которое было инициализировано с помощью конструктора копирования из переменной 'box'.

Если вы измените переменную 'box' в main на:

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

Вывод будет:

circle=6, box=0.9

P.S. Пожалуйста, не используйте указатели (Box*). Просто не надо. Используйте std::shared_ptr<> вместо этого. Есть множество хороших сайтов, объясняющих причины. У вашего класса 'circle' много проблем, связанных с указателями. Вы можете улучшить свои навыки программирования, прочитав о

  • свисающий указатель
  • deep copy против shallow copy
  • std::shared_ptr<> и std::unique_ptr<>
  • виртуальные детекторы

Веселитесь ...

...