2013-12-21 3 views
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

@ Joachim Isaksson in setDimensions 저는 메모리를 할당합니다. 불행하게도 나는 그 방법으로 유지해야한다. – user1816546

+0

@ H2CO3by는 작동하지 않는다. 나는 깊은 복사를 수행하지 않는다는 것을 의미한다. – user1816546

답변

4
  • 첫째, 그것은 그 할당 연산자의 운영자와 동일하지 않습니다.
  • 두 번째 : 할당 연산자는 포인터가 아닌 const & 매개 변수를 가져야하며 객체가 아니라 참조를 반환합니다.
  • 셋째 : 복사의 의미를 방해하는 것을 제외하고는 복사를 수행하는 assigment overload가 자동으로 컴파일러에서 제공됩니다.

포인트 3을 존중하여 "true"복사를 수행하지 않은 한 가지 작업을 수행했습니다. 포인터를 통한 동적 배열 사용. 컴파일러는 포인터 만 복사하므로 손으로 어레이를 복사하려면 자신의 operator=을 작성해야합니다 (질문에서 시도한 것).

가장 쉬운 해결책은 다음과 같습니다. 수동 메모리 관리 대신 std::vector과 같은 컨테이너를 사용하십시오. 그것은 정확하게 복사 및 양도를 구현 했으므로 수업에 자신의 operator=을 쓸 필요가 없습니다.

+0

# 3 : 그는 포인터를 복사하는 것만으로는 충분하지 않습니다. 가리키는 메모리 내용도 복사해야합니다. –

+0

To # 3 : 컴파일러는 실제로이 문제에 대해 선택의 여지가 없습니다. 복사 할당 연산자는 사용자가 선언하지 않고 사용할 때 정의 된 * 암시 적으로 * 선언되므로 컴파일러는 언어가 수행해야한다고 말하고 있습니다. –

+0

@ H2CO3 알아, 나는 질문을 편집하고 있었다 : – Manu343726