什么方法 保存某个基类的多种子类

shouso888 2012-08-09 10:39:39
三个类: 基类, 子类A, 子类B。 基类是两个子类的抽象接口,只有一个纯虚的 方法。

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

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

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

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

...全文
128 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shouso888 2012-08-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

糟糕的设计,根本没你这么干的
理解下 面向接口编程
[/Quote]

这就好比对别人说:你把 C++ 和 设计模式 学好了再来问问题
shouso888 2012-08-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

糟糕的设计,根本没你这么干的
理解下 面向接口编程
[/Quote]

帅哥,你这回答也太泛了,具体点指条明路好不
bacmoz 2012-08-09
  • 打赏
  • 举报
回复

#include <iostream>
#include <set>

class AObject;

class AObjectManager : public std::set<AObject *>
{
public:
static AObjectManager &Instance()
{
static AObjectManager inst;
return inst;
}
private:
AObjectManager() {};
virtual ~AObjectManager() {};
};

class AObject
{
public:
AObject()
{
AObjectManager::Instance().insert(this);
}
AObject(const AObject &obj)
{
AObjectManager::Instance().insert(this);
}
virtual ~AObject()
{
AObjectManager::Instance().erase(this);
}
virtual void Print() = 0;
};

class AObjectX : public AObject
{
public:
AObjectX(int x = 0)
: m_x(x) {};
virtual void Print()
{
std::cout << "AObjectX(" << m_x << ")";
}
private:
int m_x;
};

class AObjectY : public AObject
{
public:
AObjectY(int y = 0)
: m_y(y) {};
virtual void Print()
{
std::cout << "AObjectY(" << m_y << ")";
}
private:
int m_y;
};

static void PrintAllObjects(int traceindex = 0)
{
std::cout << "PrintAllObjects: " << traceindex << std::endl;
for (AObjectManager::const_iterator it = AObjectManager::Instance().begin(); it != AObjectManager::Instance().end(); ++it)
{
AObject *pObj = *it;
if (!pObj)
{
std::cout << "error!" << std::endl;
continue;
}
pObj->Print();
std::cout << std::endl;
}
std::cout << std::endl;
}

int main()
{
AObjectX *px1 = new AObjectX(1);
AObjectY *py1 = new AObjectY(1);

{
AObjectX x2(5);
PrintAllObjects(0);
AObjectX x3 = x2;
PrintAllObjects(555);
}

PrintAllObjects(1);

delete px1;

PrintAllObjects(2);

delete py1;

PrintAllObjects(3);

return 0;
}
blldw 2012-08-09
  • 打赏
  • 举报
回复
现在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的一个例子:

#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();
}
kingdom_0 2012-08-09
  • 打赏
  • 举报
回复
糟糕的设计,根本没你这么干的
理解下 面向接口编程
shouso888 2012-08-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

我觉得可以定义一个专门的类维护vector<基类*> ,所有的操作包括创建和删除都由其进行,来避免野指针。
[/Quote]

我的程序里子类对象是有可能释放的,我希望把它保存起来以后用到。现在是怎么保存各种子类对象的问题。
而不是如何预防子类对象释放的机制。我允许它释放,只要能保留他的备份就好。
Corner 2012-08-09
  • 打赏
  • 举报
回复
智能指针
微型蚂蚁 2012-08-09
  • 打赏
  • 举报
回复
我觉得可以定义一个专门的类维护vector<基类*> ,所有的操作包括创建和删除都由其进行,来避免野指针。

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧