我有一个基类的智能指针,以防止像这样的对象切片:
vector<shared_ptr<BaseClass>> vectorOfObjects;
我想通过函数传递此对象,然后将派生对象添加到矢量列表中:
function(vector<shared_ptr<BaseClass>>& vectorOfObjects) {}
在这个函数中,我创建了一个我想要添加到列表中的新派生对象:
DerivedClass derivedObject = DerivedClass();
vectorOfObjects.push_back(&derivedObject);
我在上面最后一行的点后面出现错误
no instance of overloaded function std::vector<_Ty,_Ax>::pushback
[with _Ty="std::tr1::shared_ptr<BaseClass>,_Ax=std::allocator<std:
:tr1::shared_ptr<BaseClass>>]" matches the argument list
任何帮助都会非常感激,因为我似乎找不到合适的解决方案来传递一个由对象指针组成的向量(需要防止对象切片)通过一个函数。
答案 0 :(得分:3)
使用
// DerivedClass derivedObject = DerivedClass(); <<< Not needed
vectorOfObjects.push_back(std::make_shared<DerivedClass>());
有许多constructor declarations允许从std::shared_ptr<DerivedClass>
转换为std::shared_ptr<BaseClass>
。
如果我需要单独声明,因为我的BaseClass中也有一个向量成员,我怎么能像之前尝试的那样单独声明一个derivedObject?
我不完全清楚“因为我的BaseClass中还有一个矢量成员”与它有关,但如果你坚持可以这样做:
DerivedClass derivedObject* = new DerivedClass();
// Do special stuff only available in DerivedClass
derivedObject->specialFunc();
vectorOfObjects.push_back(std::shared_ptr<DerivedClass>(derivedObject));