我有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)
。
我添加了两个deques:
std::deque<Operator> operators;
std::deque<Predicate> predicates;
然后,当我创建一个Exit
运算符时:
Exit myExit ;
并将其推入deque:
operators.push_back(myExit); // this works fine
但是当我尝试从operators
deuqe中提取某种元素时,我必须使用某种类型的转换。
是否可以拥有可以存储多个(不同类型)对象的数据结构?
我还处于规划阶段,你能否提出其他类型的设计,这样我就不会有提取元素的问题了?我能想到的最好的事情就是多态...
此致
答案 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
)。