2011-07-27 4 views
1

개체 포인터를 포함하는 모든 std :: container (특히 std :: queue)의 복사본 생성자가 멤버의 복사본 생성자를 호출하여 딥 복사본을 허용하거나 포인터 값에 얕은 복사본을 수행합니까?std :: containers 호출의 복사 생성자에 복사 생성자가 있습니까?

예 : 이벤트 복사 생성자와 기본 클래스가 자신의 복사 생성자와 여러 파생 클래스가 어디에 std::queue<Event*> _eventQueue; :로

/******************************************************************************* 
* <summary> 
* Initializes a new instance of the EventHandler class. 
* </summary> 
* 
* <param name="handler">The handler to copy.</param> 
*******************************************************************************/ 
EventHandler::EventHandler(const EventHandler& handler) : _eventQueue(handler._eventQueue) { } 

_eventQueue가 선언된다.

PS : 나는 looove (결합 특히! : D) AtomineerUtilsVisualAssistX

편집 : 아래의 답변을 감안할 때

이는 원래 같은 사본을 만들 수있는 적절한 방법이 될 것입니다 원본은 수정되지 않았으며 사본이 원본과 반대가됩니다 (간단한 수정이지만 여전히 중요한 차이점)?

EventHandler::EventHandler(const EventHandler& handler) { 
    for(size_t i = 0; i < handler._eventQueue.size(); ++i) { 
     this->_eventQueue.push(new Event(handler._eventQueue._Get_container().at(i))); 
    } 
} 
+0

유사 : http://stackoverflow.com/questions/5096464/default-assigment-operator-in-c-is-a-shallow-copy 오히려 그것은 단순히이의 상응한다. 그것이 복사 작업보다는 복사 작업에 관한 것이지만 거의 모든 것이 거기에 적용됩니다. –

답변

4

(포함 된 개체에서) 딥 복사를 수행합니다.

포함 된 모든 요소가 새 컨테이너에 복사됩니다.

그러나 컨테이너가 포인터를 포함하고 있기 때문에

(이 포함 된 객체와 같이)

std::queue<Event*> eventQueue; 

은 단지 포인터 Event*를 복사합니다. 이 경우 컨테이너 요소가 가리키는 객체는 이 아니며이 복사되지 않습니다.

0

std :: queue는 어댑터 (기본값은 deque)이므로 객체의 복사본을 저장하지만 그것은이 좋아 :

std::queue< Event* > 

는 컨테이너의 값은 포인터 타입이며, 단지 포인터가 복사됩니다.

0

요소가 포인터 인 경우 포인터 인 경우 copy-ctor를 호출하지 않습니다.

단순히 포인터를 복사합니다. 즉, new을 사용하여 새 메모리를 할당하고 포인터의 내용을 복사하지 않습니다.

to = from; //to and from are pointer of type Event* 
관련 문제