1

我有 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)

而且我希望有良好的数据结构来存储它们。

起初,我创建了两个基类并使用了继承:

  • 为, 和Predicate_At(x,y)SwithOn(x)SwitchOff(x)

  • Operator, Enter(x), Exit(x), Push(b,x,y),TurnOn(x)的类TurnOff(x)

我添加了两个双端队列:

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

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

Exit myExit ;

并将其推入双端队列:

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

但是当我尝试从operatorsdeuqe 中提取某种元素时,我必须使用某种 cast 。

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

  2. 我还处于规划阶段,您能否建议一些其他类型的设计,这样我在提取元素时不会遇到问题?我能想到的最好的事情是多态性......

问候

4

2 回答 2

2

对于您的特定要求,我会考虑使 Operator 具有多态性并将数据存储在诸如 ptr_vector 之类的 boost 指针容器中。毕竟,各种具体的操作都有一个共同点,那就是它们都是操作符。

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

boost::ptr_vector<Operator> something;

如果您不能使用 boost,另一种选择是使用带有 std::shared_ptr 之类的标准容器,例如:

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

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

于 2012-12-17T03:24:23.053 回答
1

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

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

我还处于规划阶段,您能否建议一些其他类型的设计,这样我在提取元素时不会遇到问题?我能想到的最好的事情是多态性......

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

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

于 2012-12-17T03:25:17.547 回答