包含对象指针的任何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是一个带有复制构造函数的Base类,并且有多个派生类和它们自己的复制构造函数。
P.S。:我喜欢AtomineerUtils和VisualAssistX(尤其是合并时!:D)
修改
鉴于以下答案,这是否是创建原件副本的正确方法,使原件未经修改或复制与原件相反(简单修复但仍然是一个重要的区别)?
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 :(得分:5)
执行深层复制(在包含的对象上)。
因此所有包含的元素都被复制到新容器中。
但是因为你的容器包含指针,
std::queue<Event*> eventQueue;
它只复制指针Event*
(因为这是包含的对象)。在这种情况下,容器元素指向的对象是不复制..
答案 1 :(得分:0)
std :: queue是一个适配器(默认为deque),因此它存储了一个对象的副本,但是因为你这样使用它:
std::queue< Event* >
然后容器的值是指针类型,只复制指针。