2009-12-20 7 views
8

동적으로 할당 된 메모리에 대한 포인터를 보유하는 클래스의 복사 생성자를 작성하는 중에 질문이 있습니다.딥 복사 - 포인터 값 복사

개체에서 복사 한 포인터의 값을 복사 할 개체의 포인터로 복사하도록 지정하려면 어떻게해야합니까? 분명히 이런 일이 ... 작동하지 않습니다

*foo = *bar.foo; 

바 객체 (첫번째 장소에있는 객체를 복사의 목적을) 삭제되고,이 단지에 객체의 foo는 점에 복사 한 때문에 같은 장소.

해결책은 무엇입니까? 어떻게하면 동적으로 할당 된 메모리의 가치를 받아 다른 주소로 복사 할 수 있습니까?

+0

질문은 이해되지 않는다. 아마도 당신이 요구하는 것을 보여주는 더 많은 코드를 게시 해보십시오. –

+0

추가 정보 필요 : foo의 유형이 좋을 것입니다. 다른 회원들. 스마트 포인터를 사용하지 않는 이유에 대한 설명? –

+0

배열을 다루지 만 유용 할 수 있습니다. http://stackoverflow.com/questions/255612/c-dynamically-allocating-an-array-of-objects/255744#255744 –

답변

18

당신은 내가 당신의 클래스는 다음과 같습니다 가정

class Foo 
{ 
    Foo(const Foo& other) 
    { 
     // deep copy 
     p = new int(*other.p); 

     // shallow copy (they both point to same object) 
     p = other.p; 
    } 

    private: 
     int* p; 
}; 
1

컨텍스트가 표시되지 않지만 게시 한 코드가 포인터를 복사하는 것처럼 보이지 않습니다. 정확히 무엇을 요구합니까? 포인터가 무엇이든 복사합니다. foo가 할당 된 객체를 가리킨다.

2

새로운 객체를 할당합니다. 깊은 사본을하기 위해

class Bar { 
    Foo* foo; 
    ... 
} 

, 당신은 'bar.foo'에 의해 참조 된 객체의 복사본을 만들 해야합니다.

Bar(const Bar & bar) 
{ 
    this.foo = new Foo(*(bar.foo)); 
} 

참고 : C++에서 당신은 Foo 클래스의 복사 생성자 호출 할 new 연산자를 사용하여이 작업을 수행 할이 솔루션을 대표 복사 생성자 새로운 푸 (constFoo &는) 또한 '깊은 수행 여부의 결정 Foo 클래스의 구현에 복사하십시오 ... 단순화를 위해 우리는 그것이 '옳은 일'이라고 가정합니다!

[참고 사항 ... 쓰여진 질문은 매우 혼란 스럽습니다. 내게 깊은 사본처럼 들리지 않는 '개체에서 복사 한 포인터의 값'을 묻습니다. 얕은 복사본처럼 들립니다. , 즉 이것.

Bar(const Bar & bar) 
{ 
    this.foo = bar.foo; 
} 

나는이 아스 커의 일부에 불과 무고한 혼란 가정, 깊은 복사 수배 것입니다.]

관련 문제