2010-06-26 7 views
0

J'ai une fonction déclarée dans ma classe de base et spécifiée comme virtuelle, j'essaie de la déclarer à nouveau dans une classe dérivée mais j'obtiens une erreur de déclaration multiple.Déclaration multiple pour la fonction

Quelqu'un sait-il s'il me manque quelque chose ici?

class Field { 
    public: 
     virtual void display() = 0; 
     virtual int edit() = 0; 
     virtual bool editable() const = 0; 
     virtual void *data() = 0; 
     virtual Field *clone() const = 0; 
}; 

class LField : public Field { 
     int rowNum; 
     int colNum; 
     int width; 
     char *val; 
     bool canEdit; 
     int index; 
    public: 
     virtual void *data() { return val; } 
}; 


class IVField : public LField { 

    void (*ptrFunc)(void *); 
    bool (*ptrValid)(int &); 
    int *data; 

    public: 
     void* data() { 
      return data; 
     } 

}; 

class DVField : public LField { 
    int decimalsToDisplay; 
    double *data; 
    void (*ptrFunc)(void *); 
    bool (*ptrValid)(double&); 
    public: 

     void* data() { 
      return data; 
     } 

}; 
+1

Il nous sera impossible de répondre à votre question à moins que vous ne nous indiquiez votre code. –

+0

J'ai ajouté le code. – Marcin

+2

Veuillez ajouter à nouveau le code. Ni la question ni la réponse n'ont de sens sans elle. –

Répondre

4

Vous avez une fonction nommée data et une variable de membre nommé data dans la même classe. Ce n'est pas autorisé. Choisissez un nom différent pour votre variable membre.

Vous semblez également déclarer de nombreuses variables membres. Ce n'est probablement pas ce que vous voulez faire. Si vous voulez les déclarer dans la classe de base et les utiliser dans les descendants, alors ils devraient avoir la visibilité protégée. La visibilité par défaut des classes, lorsque vous n'en avez pas spécifié, est private, ce qui signifie par exemple que les descendants de IVField (tels que DVField) ne peuvent pas accéder à la variable ptrFunc que vous avez déclarée dans IVField. La variable ptrFun que vous avez déclarée dans DVField n'a absolument aucun rapport avec celle déclarée dans la classe parente. Faites en sorte que le IVField soit protégé, puis les descendants n'ont pas besoin de dupliquer la déclaration pour eux-mêmes.

Vous allez aussi devoir mettre en œuvre toutes les autres méthodes abstraites avant que le compilateur vous permettra d'instancier l'une de ces classes.

+0

Oui, c'était le problème. Merci :) Coche la marque lorsque la minuterie est terminée. – Marcin

Questions connexes