IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

appel opérateur == de la classe de base abstraite


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 45
    Points : 44
    Points
    44
    Par défaut appel opérateur == de la classe de base abstraite
    Bonjour,
    J'ai un petit souci théorique en C++:

    Question : comment appeler dans une classe fille l'opérateur de test d'égalité de la classe mère si cette dernière est abstraite ?

    Désolé si la réponse et déjà quelque part, j'ai pas trouvé dans les diverses FAQ,et une recherche dans le forum avec les mots clé "operator héritage" me renvoie 56 pages de résultats...

    Contexte: imaginons une classe A, qu'on dérive en une classe B.
    On veut les doter d'un opérateur de test d'égalité, qui s'occupe de tester leurs données membres respectives.
    Dans la version de la classe B, on veut tester l'égalité des données membres spécifiques à B, et tester l'égalité des données membres héritées de A.
    Pour éviter la duplication de code (et les erreurs potentielles associées), j'appelle donc dans l'opérateur de B l'opérateur de A. Pour l'instant, je fais comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    class B:public A
    {
    private:
       TypeQuelconque1 dm1;
       TypeQuelconque2 dm2;
    // etc.
    public:
       bool operator == ( const B& arg ) const
       {
          if( dm1 != arg.dm1 )
             return false;
          if( dm2 != arg.dm2 )   // etc...
             return false;
     
          return (A)*this == (A)arg;
       }
    };
    Pbe: ceci est rejeté par le compilo si la classe A est virtuelle. En effet, le cast
    correspond à une (tentative de) création d'un objet de type A, ce qui est interdit si elle est abstraite.

    Question préliminaire : cette version vous paraît-elle correcte (mis à part les cast "à-la-C") ?
    Question principale: comment faire ?

    Pré-commentaire: évidemment, on peut se poser la question de la pertinence de définir un opérateur de test d'égalité pour une classe abstraite, vu que par définition on ne pourra jamais tester deux objets du type de cette classe, mais l'intérêt, c'est si je dérive A en d'autres classes: je n'aurais à définir le contenu de cet opérateur qu une seule fois.

  2. #2
    Membre actif Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Points : 288
    Points
    288
    Par défaut
    Question : comment appeler dans une classe fille l'opérateur de test d'égalité de la classe mère si cette dernière est abstraite ?
    Une classe abstraite ne contient pas de code si je ne me trompe pas

    Mis à part ça, les casts créés 2 objets A temporaires, je pense qu'utiliser des références résoudra ton pb.

  3. #3
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Je continuerais a me poser la question du sens qu'a un operateur de comparaison (qui est signe d'une semantique de valeur) pour une classe virtuelle (qui est signe d'une semantique d'entite).

    Pour l'aspect syntaxique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    this->A::operator==(arg);
     
    static_cast<A const&>(*this) == static_cast<A const&>(arg);
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  4. #4
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    Une classe abstraite peut très bien avoir certaines méthodes implémentées, l'a n'est pas le problème.

    Le fait est que comme ta classe A est abstraite, tu ne peux évidemment pas les caster en A, puisqu'une classe abstraite par définition ne peut pas être instanciée.

    Sinon un truc du genre devrait marcher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this->A::operator==(arg);
    [edit]grillé :p[/edit]

  5. #5
    Membre actif Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Points : 288
    Points
    288
    Par défaut
    Citation Envoyé par haraelendil Voir le message
    Une classe abstraite peut très bien avoir certaines méthodes implémentées, l'a n'est pas le problème.
    Mea culpa, je sais pas pourquoi ça a résonné en moi comme "interface" .

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 45
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par haraelendil Voir le message
    Sinon un truc du genre devrait marcher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this->A::operator==(arg);
    Super, merci à toi et aux autres, testé à l'instant, c'est ok.

    Je ne sais pas pourquoi je voulais caster à tout prix, l'appel explicite via l'opérateur de résolution de portée est évidemment plus commode.

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Il m'est arrivé un jour d'hériter d'un iterator. C'est vachement lourdingue syntaxiquement l'appel vers la classe parente dans chaque operator
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    this->A::operator++();
    this->A::operator++(int);
    this->A::operator==(arg);
    this->A::operator!=(arg);
    this->A::operator+=(int);
    this->A::operator-=(int);
    etc

  8. #8
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Note que le this-> n'est pas necessaire. Pour une comparaison je le trouve plus clair (A nouveau, les comparaisons et l'heritage font rarement bon menage d'une part, et d'autre part je prefere les operateurs de comparaison en fonction libre plutot qu'en membre.) mais pour ++ je crois que je m'en passerais.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Incidemment, la première réponse de Jean-Marc est dans la F.A.Q. : Quand est-ce qu'une classe a une sémantique de valeur ? et Quand est-ce qu'une classe a une sémantique de d'entité ?
    Citation Envoyé par F.A.Q (sémantique d'entité)
    On voit qu'une classe à sémantique d'entité peut servir de base à un héritage. Mais, une classe à sémantique d'entité :
    * ne redéfinit pas les opérateurs arithmétiques (+,-,/*) ;
    * n'a pas d'opérateur d'affectation (=, constructeur par copie) ;
    * ne redéfinit pas les opérateurs de comparaison (==, < etc.).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/10/2011, 19h07
  2. Réponses: 7
    Dernier message: 29/11/2007, 16h03
  3. Declaré en classe de base, instancié en sous classe
    Par jobigoud dans le forum Langage
    Réponses: 3
    Dernier message: 14/11/2005, 10h55
  4. [MySQL] proble class pour base de donner
    Par alexmorel dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/10/2005, 15h56
  5. [C#][WebServices] Appel methode avec une classe en paramètre
    Par bran_noz dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/09/2004, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo