Почему я не могу глубоко скопировать ученика - PullRequest
0 голосов
/ 31 мая 2019

Невозможно глубокое копирование одного объекта класса в другой;

У меня есть объект класса геометрии

class Geometry
 {
  public:   
     std::string stdstrType;
     bool bValid;

 public:

  Geometry()
    {
       stdstrType = "NO_TYPE";
       bValid = false;

    }

  Geometry( std::string strType , bool bValue )
  {
    stdstrType = strType;
    bValid = bValue;        
  }

 Geometry(const Geometry &g)
{
    stdstrType = g.stdstrType;
    bValid = g.bValid;
}

 ~Geometry()
 {
     qDebug() << "Geometry  destructor called";
 } 

 virtual void draw();
 bool isValid();
 void setValidState(bool bState);
 virtual void Init();
 std::string GetName(); 
};

У меня есть контейнер класса

 class Container
  {
   private:
    std::string stdstrContainerName;
    std::string stdstrPluginType;
    Geometry* Geom;

  public:
    Container();
    Container(std::string, std::string, Geometry* geometry = nullptr);
    Container(const  Container& obj);
    ~Container();
    std::string GetName();
    std::string GetType();
    void SetName(std::string stdstrName);
    Geometry* GetGeometry();
    void SetGeometry(Geometry* Geom);

  };



 Container::Container(std::string strName, std::string strType, Geometry* 
 geometry) : Geom(geometry)
{
   stdstrContainerName = strName;
  stdstrPluginType = strType;   
}


 Container::Container(const Container& obj) {
  stdstrContainerName = obj.stdstrContainerName;
  stdstrPluginType = obj.stdstrPluginType;
  Geom = new Geometry;
  *Geom = *obj.Geom;  // This Line gives error
 }

, поскольку объект-контейнер имеет элемент данных с указателем геометрии, а область действия объекта геометрии короче, чем у объекта-контейнера. поэтому я хочу сделать объект геометрии глубокого копирования внутри объекта контейнера.

Это строка в конструкторе копирования, которая выдает мне ошибку

*Geom = *obj.Geom;  // This Line gives error

Вот как я инициализирую объект-контейнер

 Geometry* geom = new Geometry;
 Container* cont = new Container("Group", "NONE", geom);

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Как прокомментировал @ rafix07, вы всегда должны проверять указатель перед разыменованием его.

if(obj.Geom != nullptr) // Check
  *Geom = *obj.Geom;  

Также вместе с конструктором копирования вы должны рассмотреть определение оператора присваивания для класса Geometry, чтобы достичь своей цели:глубокая копия.

Geometry & Geometry::operator = (const Geometry &g)
{  
  if(this != &g)
  {
    stdstrType = g.stdstrType;
    bValid = g.bValid;
  } 
  return *this;
}
0 голосов
/ 31 мая 2019

Генерация неявно определенного оператора назначения копирования не рекомендуется, если T имеет объявленный пользователем деструктор или объявленный пользователем конструктор копирования.

Вам необходимо определить оператор присваивания для вашего класса

Geometry& operator = (const Geometry &g)
Container& operator = (const Container& c)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...