2012-12-11 69 views
0

我有这样的事情:呼叫功能

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()方法,但我仍然希望将它们放在同一个向量中,因为我还希望能够遍历向量并在所有元素上调用draw()。有什么方法可以解决这个问题吗?我正在考虑有另一个载体,但我宁愿不要。

+0

尝试'dynamic_cast'实现'tick'方法的类型?或者,在基类中有一个虚拟实现,对于没有实现该方法的类型不做任何事情...... – Nim

+3

不,不要做这些事情之一。如果你有一个只有其中一些对象实现你想要调用的函数的对象向量,那么它们应该在多个集合中。创建_make sense_的接口,并且只有在__ sense_时才从它们派生。 –

+1

这是非常好奇的语句'vector [i] - > tick();' – 2012-12-11 13:36:59

回答

5

如果你有小部件的vector,但只有其中的一些小部件有一个小玩意儿,他们真的是所有小工具?

你的情况,你的东西是不一样的一个vector。这是你的问题。当然,你可以想出一些简单而复杂的机制将战舰放在铅笔杯中。或者你可以做我认为是正确的事之一:

  1. 确保一切你把到铅笔杯子铅笔
  2. 创建别的地方把战舰。上述

2号是创建一个单独的载体,你已经提到。数字1可能就像在基类中提供一个空的(不重要的)实现方法一样简单地提供了virtual tick()方法。

+0

我喜欢这个答案,谢谢:) – Topsic

0

我认为你可以在this case使用访问者模式。但这不是最好的解决方案。你制动Liskov替代原则。重新思考你的等级。