【问题标题】:Deep copy of a class with overloading of assignment operator具有赋值运算符重载的类的深拷贝
【发布时间】:2013-12-21 11:28:36
【问题描述】:

我正在尝试通过重载等号运算符来创建类的深层副本 - 但是,它似乎不起作用。任何帮助表示赞赏!

这是我要复制的课程:

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;

    }

这是main中的函数调用。 myMap 是一个 CMap 数组。

CMap tempMap;
        tempMap.setDimensions(myMap[0].m_nHeight, myMap[0].m_nWidth);
        tempMap.m_pData = myMap[0].m_pData;

【问题讨论】:

  • “它似乎不起作用”是非信息性的。
  • @Joachim Isaksson 在 setDimensions 我分配内存。不幸的是,我必须保持这种状态
  • @H2CO3 不工作,我的意思是它没有执行深层复制。
  • 所以,检查一些可能的常见问题。比如this->m_pDatarhs->m_pData是同一个指针吗?
  • @H2CO3 我只是将它作为检查包含在重载运算符中

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


【解决方案1】:
  • 首先:这不是等于运算符,而是赋值运算符。
  • 第二:赋值运算符应该有一个const &参数,而不是一个指针,并且返回一个对对象的引用,而不是任何东西。
  • 第三:除了你做了一些干扰复制语义的事情之外,编译器会自动提供一个执行复制的赋值重载。

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

最简单的解决方案是:使用像std::vector 这样的容器,而不是手动管理内存。它已经实现了正确的复制和分配,所以你不必在你的课堂上写你自己的operator=

【讨论】:

  • 至#3:他正试图做到这一点(复制指针是不够的,还应该复制指向的内存内容。)
  • 致#3:编译器在这件事上真的别无选择。如果不是用户声明的复制赋值运算符,则隐式声明,并在使用时定义,因此编译器只是按照语言所说的去做。
  • @Manu343726 手动内存管理是我任务的重点。我认为我没有正确地重载赋值运算符?
  • @user1816546 是的。它没有那个签名。签名是foo& operator=( const foo&)(假设你的班级叫foo)。复制后应该返回对对象的引用,即return *this;
  • @KerrekSB 我知道,这就是我建议 OP 使用标准容器的方式,这很容易。
猜你喜欢
  • 2010-11-01
  • 1970-01-01
  • 2019-10-25
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 2013-06-19
相关资源
最近更新 更多