c++ - 如何在不进行类型转换的情况下从双端队列中提取?

标签 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)

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

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

  • Class Predicate for At(x,y) , SwithOn(x)SwitchOff(x)

  • Class Operator for 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 中提取某种元素时,我必须使用某种类型的转换。

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

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

问候

最佳答案

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

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

boost::ptr_vector<Operator> something;

如果你不能使用 boost,另一种选择是使用标准容器和类似 std::shared_ptr 的东西,例如:

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

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

关于c++ - 如何在不进行类型转换的情况下从双端队列中提取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13907834/

相关文章:

c# - 如何自动将 const wchar_t* 从 C DLL 转换为 C# 字符串

c++ - 没有计数器的for循环的可读性

objective-c - Objective C 辅助方法

javascript - 数据结构-如何在javascript中实现哈希表(包括关联列表)?

c# - 如何按递增顺序从数组创建整体列表(子列表)

c++ - 在 C++ 中循环定义函数的参数

c++ - 为什么 {1, 2} 没有类型,但 decltype(a) 格式良好?

python - 我继承的类 MenuBar(tk.Menu) 不显示菜单栏

c++ - 为什么我的虚拟函数 "unique"不工作?

c++ - 实现加权图的问题[c++]