Содержит ли конструктор копирования вызова std :: Containers конструкторы копирования? - PullRequest
1 голос
/ 27 июля 2011

Вызывает ли конструктор копирования любого std :: container (в частности, std :: queue), содержащего указатели объектов, конструкторы копирования члена, чтобы разрешить глубокие копии, или он выполняет поверхностное копирование значений указателя?

Пример:

/*******************************************************************************
 * <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 объявляется как: std::queue<Event*> _eventQueue;, где Event - это базовый класс с конструктором копирования и имеет несколько производных классов со своими собственными конструкторами копирования.

P.S .: Я люблю AtomineerUtils и VisualAssistX (особенно в сочетании!: D)

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)));
    }
}

Ответы [ 2 ]

5 голосов
/ 27 июля 2011

Выполняет глубокое копирование (на содержащийся объект).

Таким образом, все содержащиеся элементы копируются в новый контейнер.

Но так как ваш контейнер содержит указатели,

std::queue<Event*>   eventQueue;

это только копирование указателя Event* (так как это содержащийся объект). В этом случае объект, на который указывают элементы контейнера, не скопирован ..

0 голосов
/ 27 июля 2011

std :: queue является адаптером (по умолчанию deque), поэтому он хранит копию объекта, но, поскольку вы используете его следующим образом:

std::queue< Event* >

тогда значение контейнера является типом указателя, и копируется только указатель.

...