【发布时间】:2014-12-05 23:29:19
【问题描述】:
我遇到了复制构造函数的问题...我认为对此有一个基本的答案,但我遗漏了一些明显的东西-也许我做错了-但我无法想办法。
基本上,我有一个父类和子类。父类包含指向(不同)基类对象的指针向量。子类希望存储指向从该基对象派生的对象的指针。
这是一个伪代码示例,如果有帮助的话:
// Base classes
class ItemRev {
...
}
class Item {
protected:
vector<ItemRev *> m_revPtrVec;
}
Item::Item(const Item &inputItemObj)
{
// Copy contents of the input object's item rev pointer vector
vector<ItemRev *>::const_iterator vecIter = (inputItemObj.m_revPtrVec).begin();
while (vecIter != (inputItemObj.m_revPtrVec).end()) {
(this->m_revPtrVec).push_back(new ItemRev(**vecIter));
}
}
=========
// Derived classes
class JDI_ItemRev : public ItemRev {
...
}
class JDI_Item : public Item {
...
}
JDI_Item::JDI_Item(const JDI_Item &itemObj)
{
// Copy contents of the input object's item rev pointer vector
vector<ItemRev *>::const_iterator vecIter = (inputItemObj.m_revObjPtVec).begin();
// The below does not work!
while (vecIter != (inputItemObj.m_revObjPtVec).end()) {
m_revObjPtVec.push_back(new JDI_ItemRev(**vecIter));
}
}
上述问题出在JDI_Item复制构造函数中的push_back()调用中。
鉴于此设置,子类的复制构造函数应该是什么样的?我什至需要一个子类复制构造函数吗?我假设我做到了,因为复制构造函数正在创建新对象,而父复制构造函数将在派生类中创建不是我想要的类型的新对象(即,父对象存储指向 ItemRev 对象的指针,而子对象应存储指向派生的JDI_ItemRev 对象的指针)。
【问题讨论】:
-
你需要一个从基础复制的构造函数,带有签名
JDI_Item::JDI_Item(const ItemRev &)的东西。默认情况下不会为您生成此构造函数,因为它很少有意义。 -
首先,
JDI_Item-ctor 有问题。如果抛出任何异常,它就会泄漏。为什么你有一个std::vector指向JDI_ItemRev的指针?为什么它们不直接在向量中,或者至少由智能指针管理? (在第一种情况下,隐式定义应该有效。)Item也可以这样说。
标签: c++ pointers constructor