2011-11-17 3 views
2

J'ai les classes suivantes. Une erreur se produit pendant la boucle for dans la classe Main. Le compilateur se plaint de la fonction draw "est de type GLCommand". L'idée de l'application est de stocker de nombreux types de GLCommand et Shape dans le même vecteur. Devrais-je adopter une approche de conception différente, ou est-ce une solution simple à ce problème?itération à travers un vecteur de classes abstraites

Interface:

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

Résumé Classe:

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

}; 

classe dérivée:

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

    void draw(); 

private: 
    vector<Coordinates *> verticies; 

}; 

principal:

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

Votre titre de la question ne correspond pas à votre code. Vous avez un vecteur de * pointeurs *, pas de "classes abstraites". –

Répondre

8

Rien de ce que vous avez dit n'est pertinent; le problème est la priorité des opérateurs:

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

Oups! Merci. – nf313743

+0

Serait-il possible de m'expliquer pourquoi les parenthèses sont requises ici? La seule fois où j'ai vu un pointeur déréférencé comme ceci est lorsque vous utilisez la notation par points pour appeler une fonction membre, par exemple: (* ptr) .foo(); – nf313743

+0

L'opérateur de déréférencement a simplement une priorité inférieure à celle de l'opérateur d'accès membre '->', donc '* it-> x' est' * (it-> x) ', et non' (* it) -> x'. De même, '* ptr.foo()' est '* (ptr.foo())', pas '(* ptr) .foo()'. –

1

entre parenthèses Mettez au bon endroit:

(*it)->draw(); 

Ou, pour éviter ces problèmes, utilisez boost :: ptr_vector lorsque votre conteneur porte la propriété de ses objets.

1

Comme d'autres ont noté sa précédence.

Mais vous pouvez utiliser les algorithmes de STL pour obtenir l'effet dont vous avez besoin beaucoup plus facile:

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