【问题标题】:How to extract from a deque without casting?如何在不强制转换的情况下从双端队列中提取?
【发布时间】:2012-12-17 03:15:36
【问题描述】:

我有 5 个称为操作符的类:

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

还有 3 个称为谓词的类:

 * 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 

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

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

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

问候

【问题讨论】:

  • 你可以使用 boost 变体。
  • 为什么需要强制转换回特定的类(Enter、Exit 等)?你能否设计你的类,例如,你可以简单地调用operator.operate(),它专门用于每个派生类?

标签: c++ inheritance data-structures deque


【解决方案1】:

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

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

boost::ptr_vector<Operator> something;

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

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

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

【讨论】:

    【解决方案2】:

    有没有可能有一个数据结构可以存储多个 对象?

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-13
      • 2018-07-16
      • 2013-05-23
      • 2020-08-08
      • 2014-09-27
      • 1970-01-01
      • 2018-03-02
      • 2018-01-01
      • 1970-01-01
      相关资源
      最近更新 更多