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

EDIT:以下の答えを考える

が、これはそのオリジナルなのコピーを作成するための適切な方法だろうオリジナルは変更されていないか、コピーは元のものとは逆のものになります(単純な修正ですが、依然として重要な違いです)。

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* 
関連する問題