如何从没有铸造的双端队列中提取?

时间:2012-12-17 03:15:36

标签: c++ inheritance data-structures deque

我有5个叫做运算符的类:

 * Enter(x)
 * Exit(x)
 * Push(b,x,y)
 * TurnOn(x)
 * TurnOff(x)

还有3个叫做Predicates的类:

 * At(x,y) - example : At(Robot,Room3) , At(Box1,Room1) , At(Box3,Corridor)
 * SwithOn(x) - SwitchOn(Room2)
 * SwitchOff(x) - SwitchOff(Room1) , SwitchOff(Room4)

我想拥有良好的数据结构存储它们。

首先,我创建了两个基类并使用了继承:

  • PredicateAt(x,y)SwithOn(x)

  • 的课程SwitchOff(x)
  • OperatorEnter(x)Exit(x)Push(b,x,y)TurnOn(x)的课程TurnOff(x)

我添加了两个deques:

std::deque<Operator> operators;
std::deque<Predicate> predicates;

然后,当我创建一个Exit运算符时:

Exit myExit ;

并将其推入deque:

operators.push_back(myExit); // this works fine 

但是当我尝试从operators deuqe中提取某种元素时,我必须使用某种类型的转换。

  1. 是否可以拥有可以存储多个(不同类型)对象的数据结构?

  2. 我还处于规划阶段,你能否提出其他类型的设计,这样我就不会有提取元素的问题了?我能想到的最好的事情就是多态...

  3. 此致

2 个答案:

答案 0 :(得分:2)

根据您的具体要求,我会考虑使运算符具有多态性,并将数据存储在像ptr_vector这样的boost指针容器中。毕竟,有意义的是,各种特定操作都有共同点,即它们是操作员。

您使用基本std :: deque&lt;&gt;的当前实现将导致对象切片,因为您只存储基类,因此不会起作用。在需要多态性的特殊情况下,您确实需要能够存储指向对象的指针。在您的情况下,您可能想要使用

boost::ptr_vector<Operator> something;

如果你不能使用boost,另一个选择是使用像std :: shared_ptr这样的标准容器,例如:

std::deque<std::shared_ptr<Operator> > something;

您不希望将原始指针存储在std :: vector中,因为这会导致各种有趣的生命周期管理问题,这些问题很容易避免。

答案 1 :(得分:1)

  

是否可以拥有可以存储多个数据结构的数据结构   对象?

是的,它被称为结构。如果您一次只想存储一种类型,可以使用union创建变体。对于你描述的内容,两者都不是一个好主意。

  

我还处于规划阶段,你能否提一些建议?   其他类型的设计,所以我不会有提取元素的问题   ?我能想到的最好的事情就是多态...

听起来像你需要多态性。您不能只使用强制转换将一种类型从基本类型转换为另一种类型。嗯,你可以,但你会丢失数据。您现在拥有的是将子类有效地转换为基类,然后按值复制到deque

要利用多态性,只需在deque中存储指针(Opererator*Predicate*)(或使用std::auto_ptr)。