首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

什么步骤 保存某个基类的多种子类

2012-09-24 
什么方法 保存某个基类的多种子类三个类: 基类, 子类A, 子类B。 基类是两个子类的抽象接口,只有一个纯虚的

什么方法 保存某个基类的多种子类
三个类: 基类, 子类A, 子类B。 基类是两个子类的抽象接口,只有一个纯虚的 方法。

现希望:新建一个类 ,它能保存以上的三个类,根据需要对以上类进行多态的方法调用。

我在新类中用 一个 vector<基类*> p_list_; 保存了一些子类A或B的对象的指针,然后根据需要
执行类似 (*p_list_[i]).方法 。 

这就有个缺点,当指针所指的对象释放了,指针就成野指针了,所以现在希望把这些对象
完整地拷贝一份存起来,再根据需要直接执行 对象.方法 。 

问题:用什么容器保存那些对象?这个容器保存的对象的的类型是什么? 如果是 vector<基类> 就把子类的信息抹杀了,
如果是 vector<子类A> 就不能保存 子类B 的对象。。求解。



[解决办法]
我觉得可以定义一个专门的类维护vector<基类*> ,所有的操作包括创建和删除都由其进行,来避免野指针。
[解决办法]
智能指针
[解决办法]
现在shared_ptr和unique_ptr已经被列入C++11标准了,而且visual studio 2012和GCC的较新版本已经对其支持了,因此可以根据Corner514的思路使用智能指针来避免对象被意外释放,导致vector中存储的是野指针的情况。
对于shared_ptr(共享指针),当没有任何shared_ptr引用对象时,该对象才会被释放,而且shared_ptr支持拷贝操作。对于unique_ptr(独占指针),类似shared_ptr,但是不支持拷贝操作。
楼住可以参考boost中shared_ptr和unique_ptr的相关资料,来决定使用哪一个。以下是使用shared_ptr的一个例子:

C/C++ code
#include <iostream>#include <vector>#include <boost/shared_ptr.hpp>class Base {public:  virtual void fun() = 0;};class A : public Base {public:  virtual void fun() {    std::cout << "A::fun()" << std::endl;  }};class B: public Base {public:  virtual void fun() {    std::cout << "B::fun()" << std::endl;  }};int main(){  std::vector<boost::shared_ptr<Base> > v;  v.push_back(boost::shared_ptr<Base>(new A));  v.push_back(boost::shared_ptr<Base>(new B));  v[0]->fun();  v[1]->fun();  } 

热点排行