2011-11-17 37 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));