堆栈的多态类

时间:2011-04-12 07:58:40

标签: c++ arrays polymorphism derived

亲爱的C ++专业人士。我遇到了问题。我有一个程序,它有1个抽象类base_class和2个派生类:sippeers和dbget。它还有2个线程。第一个线程从用户获取命令,第二个线程执行这些命令。两个派生类都表示不同的命令。所以,我必须创建某种堆栈,我应该从第一个线程放置用户命令,并在第二个线程中处理它们。要为所有命令创建一个堆栈,我必须使用多态。首先,我尝试使用std :: list。但是第一个问题是:我无法列出抽象类。然后我尝试使用boost :: ptr_list,但是存在第二个问题:在第一个线程中创建的类在创建它们的过程结束时消失。所以指针变得非法。问题是:我应该使用什么样的实现?看起来我必须存储派生类的每个副本。但在哪里?

2 个答案:

答案 0 :(得分:1)

shared_ptr<base_class>的std :: queue是将类从1个线程传递到另一个线程的最简单的解决方案,而不必担心内存管理问题。结合条件变量来表示队列不为空,因此消费者线程可以等待。

对于多态部分,有一个额外的虚函数(execute()?),因此消费者线程不应该知道它实际接收的是什么类。

答案 1 :(得分:1)

  

首先,我尝试使用std :: list。但是第一个问题是:我无法列出抽象类。

可以,然而,创建一个std::list指针到抽象基类,e.g。

std::list<base_class *> commands;
  

然后我试图使用boost :: ptr_list,但有第二个问题:类,在第一个线程创建的,dissappear与过程结束时,创建它们。所以指针变得非法。

你的意思是新命令是在第一个线程的堆栈上创建的吗?不这样做 - 第一个线程不知道什么时候第二个线程处理完命令,所以当他们结束了第一线应该没有定义。让第一个线程使用new分配对象。

话虽这么说,你的用例听起来像是生产者 - 消费者问题的典型例子。请考虑一下the Wikipedia page在这个关于如何正确实施这样一个系统一些启发(它不是太难理解错误)。