mez*_*hic 3 c++ polymorphism vector
我有一个继承层次结构,其中A是抽象基类,B和C是多态子.
我希望在堆上有一个vector类数据成员,它可以包含B和C对象.
所以在头文件中我有我的
vector<A*> polymorphicobjs;
Run Code Online (Sandbox Code Playgroud)
在我试图做的构造函数中:
polymorphicobjs = new vector<A>();
Run Code Online (Sandbox Code Playgroud)
但显然这不起作用.我该如何实现这一目标?
你不应该担心保留一个std::vector原始指针.稍后确保您在正确的时间删除对象会给您带来很多麻烦.你应该做的是存储一个"托管"多态对象的容器(使用智能指针).声明你的向量:
std::vector<std::unique_ptr<A>> polymorphicobjs;
Run Code Online (Sandbox Code Playgroud)
现在,您可以非常轻松地在向量中存储多态对象(其中B是子类A):
polymorphicobjs.push_back(std::unique_ptr<B>(new B));
Run Code Online (Sandbox Code Playgroud)
有了这个,您无需担心调用delete向量中的对象.只要你"放开"向量(例如,当它超出你的函数中的范围,或者如果它是类成员则自动被破坏),对象将被删除.矢量唯一地拥有对象.
但我需要与其他代码共享对象?!
如果是这样的话,则std::unique_ptr不是正确的选择.我们可以表达的对象共享使用std::shared_ptr:
std::vector<std::shared_ptr<A>> polymorphicobjs;
// [...]
polymorphicobjs.push_back(std::make_shared<B>());
Run Code Online (Sandbox Code Playgroud)
为什么push_back独特和共享的外观不同?
因为C++ 14还没有出来.如果你足够幸运地使用足够新的编译器(前沿clang/gcc/VS2013),那么唯一版本看起来非常相似:
// C++14
std::vector<std::unique_ptr<A>> polymorphicobjs;
// [...]
polymorphicobjs.push_back(std::make_unique<B>());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3352 次 |
| 最近记录: |