迭代通过抽象类的向量

时间:2011-11-17 15:49:00

标签: c++ stl abstract-class

我有以下课程。 Main类中的for循环期间发生错误。编译器抱怨draw函数“是非类型GLCommand”。该应用程序的想法是在同一向量中存储许多不同类型的GLCommandShape。我应该采用不同的设计方法,还是解决这个问题的简单方法?

接口:

class GLCommand
{
    public:
        GLCommand();
        virtual ~GLCommand();
    virtual void draw() = 0;
};

抽象类:

class Shape : public GLCommand
{
public:
  Shape(int);
  virtual ~Shape();
  virtual void draw() {};
private:
  double colour[];
  int sides;

};

派生类:

class Polygon : public Shape
{
  public:
    Polygon(int sides);
    virtual ~Polygon();

    void draw();

private:
  vector<Coordinates *> verticies;

};

主:

int main()
{
    vector <GLCommand*> vec;
    Polygon p(4);

    vec.push_back(&p);

    for (vector<GLCommand*>::iterator it = vec.begin(); it!=vec.end(); ++it)
    {
      *it->draw();
    }
    return 0;
}

3 个答案:

答案 0 :(得分:8)

你说的没有关系;问题只是运算符优先级:

(*it)->draw();

答案 1 :(得分:1)

将括号放在正确的位置:

(*it)->draw();

或者,为避免这些问题,请在容器承载其对象的所有权时使用boost :: ptr_vector。

答案 2 :(得分:1)

正如其他人已经注意到它的优先权。

但您可以使用STL算法更轻松地实现所需的效果:

std::for_each(vec.begin(), vec.end(), std::mem_fun(&GLCommand::draw));