具有重载赋值运算符的类的深层副本

时间:2013-12-21 11:28:36

标签: c++ operator-overloading deep-copy

我试图通过重载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;

1 个答案:

答案 0 :(得分:4)

  • 首先:那不是等于运算符,它是赋值运算符。
  • 第二:赋值运算符应该有const &参数,而不是指针,并返回对象的引用,而不是任何内容。
  • 第三:除了你做一些干扰复制语义的事情外,编译器会自动提供复制的分配重载。

尊重第三点,你做了一件不做的事情" true"复制:通过指针使用动态数组。编译器只会复制指针,所以你必须编写自己的operator=来手动复制数组(你在问题中尝试的是什么)。

最简单的解决方案是:使用std::vector之类的容器而不是手动内存管理。它已经正确地实现了复制和分配,因此您不必在班级中编写自己的operator=