我有这样的事情:
class A {
void add (A* a) {
//add a to a vector<A*>
}
virtual void draw() = 0;
}
class B : public A {
void tick() {}
void draw() {}
}
class C : public A {
void draw() {}
}
现在我要做的就是有一个这样的循环:
for(int i=0; i<vector.size(); i++) {
vector[i]->tick();
}
问题是并非此向量中的所有元素都具有tick()
方法,但我仍然希望将它们放在同一个向量中,因为我还希望能够遍历向量并调用{{ 1}}关于所有元素。有什么方法可以解决这个问题吗?我正在考虑使用另一种载体,但我宁愿不这样做。
答案 0 :(得分:5)
如果你有一个vector
小部件,但只有部分小部件有dingbat,那么它们真的都是小部件吗?
在你的情况下,你有vector
个不一样的东西。这是你的问题。当然,你可以想出一些hacky,复杂的机制,把一艘战舰放在铅笔杯里。或者你可以做我认为合适的事情之一:
上面的数字2正在创建一个单独的向量,正如您已经提到的那样。数字1可能就像在基类上提供一个空(普通)实现的virtual tick()
方法一样简单。
答案 1 :(得分:0)
我认为你可以在this case使用访客模式。但这不是最好的解决方案。你制动Liskov替代原则。重新思考层次结构。