2012-06-24 9 views
1

개체에 대한 포인터의 동적 배열의 전체 복사본을 어떻게 만듭니 까? 나는이 코드를 믿는다. 객체에 대한 포인터를 위해서만 새로운 메모리를 할당하고 있지만 여전히 같은 위치를 가리키고있다. 따라서 "복사 한"이미지를 변경하면 원본 이미지도 변경되고 그 반대의 경우도 마찬가지입니다.어떻게 객체에 대한 포인터의 복사 생성자를 생성합니까 (딥 복사)?

감사합니다.

declatration :

복사 생성자에서
Class Scene 
{ 
public: 
    . 
    . 
    . 
    . 
private: 
    Image ** sceneImage; 
    int * coordinateX; 
    int * coordinateY; 
    int inputMax; 
}; 

...

Scene::Scene (const Scene & source) 
{ 
    inputMax = source.inputMax; 
    sceneImage = new Image*[inputMax]; 
    coordinateX = new int[inputMax]; 
    coordinateY = new int[inputMax]; 

    // copy even null indexes, because you can put images on null indexes 
    for (int i = 0; i < inputMax; i++) 
    { 
     sceneImage[i] = source.SceneImage[i]; 
     coordinateX[i] = source.coordinateX[i]; 
     coordinateY[i] = source.coordinateY[i]; 
    } 
} 

답변

2

난 당신이 오히려 이것에 대한 벡터를 사용하는 것이 좋습니다. 동적 배열은 포인터보다 우아하고 자동으로 복사됩니다.

의미 론적 의미가있는 경우에만 (배열 ≠ 포인터) 누드 포인터를 사용하십시오. 이것은 C++의 경우에만 드물게 발생합니다.

4

new[]의 모든 용도를 즉시 삭제하십시오. std::vector을 사용하십시오. 그런 다음 자신을 복사합니다. 그리고 소유 포인터의 모든 사용을 중단하고 스마트 포인터를 사용하십시오.

1

벡터는 좋은 생각입니다. 그러나 모든 코드를 리팩토링 할 수 없다면 :

for (int i = 0; i < inputMax; i++) 
{ 
    sceneImage[i] = new Image(*(source.SceneImage[i])); 
    coordinateX[i] = source.coordinateX[i]; 
    coordinateY[i] = source.coordinateY[i]; 
} 

나중에 이미지를 삭제해야합니다.

관련 문제