我有 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
forAt(x,y)
,SwithOn(x)
和SwitchOff(x)
Class
Operator
forEnter(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 中提取某种元素时,我必须使用某种类型的转换。
是否可以有一个可以存储多个(不同类型)对象的数据结构?
我仍处于规划阶段,您能否建议一些其他类型的设计,这样我在提取元素时就不会遇到问题?我能想到的最好的事情就是多态...
问候
最佳答案
根据您的具体要求,我会考虑使运算符多态化并将数据存储在像 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/