2011-11-17 40 views
2

我有以下类。在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; 
} 
+0

你的问题标题不符合您的代码。你有一个*指针向量*,而不是“抽象类”。 –

回答

8

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

(*it)->draw(); 
+0

糟糕!谢谢。 – nf313743

+0

是否可以向我解释为什么这里需要括号?我唯一一次看到一个像这样解除引用的指针是当你使用点符号来调用一个成员函数时,例如:(* ptr).foo(); – nf313743

+0

解引用运算符的优先级低于' - >'成员访问运算符,所以'* it-> x'是'*(it-> x)',而不是'(* it) - > x'。同样,'* ptr.foo()'是'*(ptr.foo())',而不是'(* ptr).foo()'。 –

1

在正确的地方认沽括号:

(*it)->draw(); 

或者,要避免这些问题,使用的boost :: ptr_vector当你的容器承载其对象的所有权。

1

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

但是你可以使用STL算法实现的影响,你需要容易得多:

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