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()所有元素。有没有办法解决这个问题?我正在考虑使用另一个向量,但我不想这样做。

4

2 回答 2

5

如果你有一个vector小部件,但只有其中一些小部件有 dingbat,它们真的都是小部件吗?

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

  1. 确保你放入铅笔杯的所有东西都是铅笔
  2. 创建其他地方放置战舰。

正如您已经提到的,上面的 2 号是创建一个单独的向量。数字 1 可能就像virtual tick()在基类上提供一个具有空(平凡)实现的方法一样简单。

于 2012-12-11T13:41:51.037 回答
0

我认为您可以在这种情况下使用访问者模式。但这不是最好的解决方案。你刹车里氏替换原则。重新考虑你的层次结构。

于 2012-12-11T13:39:16.037 回答