繁体   English   中英

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

[英]Deep copy of a class with overloading of assignment operator

我正在尝试通过重载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是CMap的数组。

CMap tempMap;
        tempMap.setDimensions(myMap[0].m_nHeight, myMap[0].m_nWidth);
        tempMap.m_pData = myMap[0].m_pData;
  • 首先:不是等于运算符,而是赋值运算符。
  • 第二:赋值运算符应具有const &参数,而不是指针,并返回对该对象的引用,而不是任何内容。
  • 第三:除了您做的事情会干扰复制的语义之外,编译器会自动提供复制的分配超载。

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

最简单的解决方案是: 使用类似std::vector类的容器来代替手动内存管理 它已经正确实现了复制和分配,因此您不必在您的课堂上写下自己的operator=

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM