我有一个继承层次结构,其中A是一个抽象基类,B和C是多态子.
我希望在堆上有一个vector类数据成员,它可以包含B和C对象.
所以在头文件中我有我的
vector<A*> polymorphicobjs;
在我试图做的构造函数中:
polymorphicobjs = new vector<A>();
但显然这不起作用.我该如何实现这一目标?
解决方法:
你不应该担心保留std :: vector的原始指针.稍后确保您在正确的时间删除对象会给您带来很多麻烦.你应该做的是存储一个“托管”多态对象的容器(使用smart pointers).声明你的向量:
std::vector<std::unique_ptr<A>> polymorphicobjs;
现在你可以很容易地在向量中存储多态对象(其中B是A的子类):
polymorphicobjs.push_back(std::unique_ptr<B>(new B));
有了这个,您不必担心在向量中的对象上调用delete.只要你“放开”向量(例如,当它超出你的函数中的范围,或者如果它是一个类成员就自动被破坏),对象将被删除.矢量唯一地拥有对象.
但我需要与其他代码共享对象?!
如果是这种情况,那么std :: unique_ptr不是正确的选择.我们可以通过使用std :: shared_ptr表示对象是共享的:
std::vector<std::shared_ptr<A>> polymorphicobjs;
// [...]
polymorphicobjs.push_back(std::make_shared<B>());
为什么push_back对于unique和shared来说看起来有所不同?
因为C 14尚未出局.如果你足够幸运地使用足够新的编译器(前沿clang / gcc / VS2013),那么唯一版本看起来非常相似:
// C++14
std::vector<std::unique_ptr<A>> polymorphicobjs;
// [...]
polymorphicobjs.push_back(std::make_unique<B>());