Глубокая копия класса с перегрузкой оператора присваивания

0

Я пытаюсь создать глубокую копию класса, перегружая оператор equals, однако он, похоже, не работает. Любая помощь ценится!

Это класс, который я пытаюсь скопировать:

class CMap {

public: 

    int m_nWidth;
    int m_nHeight;
    char* m_pData;
    void setDimensions(int nWidth, int nHeight);
    void operator = (CMap* rhs);

};

это мой перегруженный оператор:

CMap& operator = (const CMap&rhs)
    {
        if (this == &rhs)
        return *this;
    memcpy(this -> m_pData, rhs.m_pData, sizeof(char)*rhs.m_nWidth*rhs.m_nHeight);
        return *this;

    }

и это вызов функции в основном. myMap - это массив CMaps.

CMap tempMap;
        tempMap.setDimensions(myMap[0].m_nHeight, myMap[0].m_nWidth);
        tempMap.m_pData = myMap[0].m_pData;
  • 0
    «Это не похоже на работу» неинформативно.
  • 0
    @ Йоахим Исакссон в setDimensions я выделяю память. К сожалению, я должен держать это так
Показать ещё 3 комментария
Теги:
operator-overloading
deep-copy

1 ответ

4
  • Во-первых: это не оператор равенства, что оператор присваивания.
  • Второй: оператор присваивания должен иметь параметр const &, а не указатель, и возвращает ссылку на объект, а не что-либо.
  • В-третьих: кроме того, что вы делаете что-то, что мешает семантике копирования, автоматически возникает перегрузка, которая копирует копию.

Уважайте точку три, вы сделали одну вещь, которая не выполняет "истинное" копирование: использование динамического массива с помощью указателя. Компилятор будет копировать только указатель, поэтому вам нужно написать собственный operator= чтобы скопировать массив вручную (что вы пытаетесь в вопросе).

Самое простое решение: использовать вместо std::vector вместо ручного управления памятью. Он правильно выполнил копирование и настройку, поэтому вам не нужно писать собственный operator= в своем классе.

  • 0
    На # 3: он пытается сделать именно это (недостаточно копировать указатель, также необходимо скопировать содержимое памяти, на которое указывает).
  • 0
    На # 3: у компилятора действительно нет выбора в этом вопросе. Оператор присваивания копии объявляется неявно, если он не объявлен пользователем и определяется при использовании, поэтому компилятор просто делает то, что говорит язык.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню