Forum Programmation.c++ Problème d'héritage

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
11
août
2013

Bonjour,

Récemment, j'ai un problème d'héritage en C++ qui est un peu exotique je trouve.

classefille.cpp:4: erreur : class 'ClasseFile' does not have any field named 'm_attribut'
     m_attribut (attribut)
     ^

J'ai une classe ClasseMere qui possède un attribut, une référence d'un objet. La classe ClasseFille en hérite, mais ne semble pas posséder elle aussi cet attribut, alors qu'il est bel et bien en protected.
Enfin bref, je poste le code source ici :

classemere.h

#ifndef CLASSEMERE_H
#define CLASSEMERE_H

#include "autreclasse.h"

class ClasseMere
{
public:
    ClasseMere();
    virtual void func () = 0;

protected:
    AutreClasse &m_attribut;


};

#endif // CLASSEMERE_H

classemere.cpp

#include "classemere.h"

ClasseMere::ClasseMere ()
{
}

classefille.h

#ifndef CLASSEFILLE_H
#define CLASSEFILLE_H

#include <iostream>

#include "classemere.h"

class ClasseFille : public ClasseMere
{
public:
    ClasseFille (AutreClasse &attribut);
    virtual void func ();

protected:
    void AutreFonction ();

};

#endif // CLASSEFILLE_H

classefille.cpp

#include "classefille.h"

ClasseFille::ClasseFille(AutreClasse& attribut) :
    m_attribut (attribut)
{
}

void ClasseFille::func()
{
//
}

void ClasseFille::AutreFonction()
{
    //
}

Si je comprends bien l'erreur que m'affiche QtCreator, le constructeur bogue parce que ClasseFille n'a pas l'attribut m_attribut. Mais ClasseFille hérite de ClasseMere. J'ai déjà essayé de passer m_attribut en public, mais sans succès.

Quelqu'un voit-il où se trouve mon erreur ?

  • # ClasseMere est inutilisable.

    Posté par  . Évalué à 10. Dernière modification le 11 août 2013 à 12:10.

    class ClasseMere {
    /* ... */
        ClasseMere() {}
    /* ... */
        AutreClasse &m_attribut;
    };

    En C++, les références sont immuables et doivent donc être obligatoirement initialisées. Vu que ton constructeur n'initialise rien, il est invalide. Ta classe ne peut donc pas être construite, donc elle est inutilisable.

    Vu que les héritiers ont aussi besoin de construire la classe de base, les héritiers sont inutilisables aussi.

    Si je comprends bien l'erreur que m'affiche QtCreator, le constructeur bogue parce que ClasseFille n'a pas l'attribut m_attribut.

    Non, l'erreur c'est que ClasseFille n'a pas de champ m_attribut. Un champ et un attribut (on parle plutôt de membre en C++), ce n'est pas la même chose.

    ClasseFille n'a qu'un seul champ: ClasseMere (qui elle, contient un champ m_attribut). Si ClasseFille avait aussi un attribut m_coucou, alors ClasseFille aurai deux champs: ClasseMere et m_coucou.

    Un constructeur de classe ne peut initialiser que ses propres champs. Donc ClasseMere doit initialiser m_attribut et ClasseFille doit initialiser ClasseMere, en lui passant la référence en paramètre, par exemple.

    • [^] # Re: ClasseMere est inutilisable.

      Posté par  . Évalué à 2.

      Effectivement, ça marche. Merci beaucoup !

      • [^] # Re: ClasseMere est inutilisable.

        Posté par  (site web personnel) . Évalué à 1. Dernière modification le 17 août 2013 à 19:04.

        La réponse de BatchyX est très bien, si tu débutes en C++ et que tu causes un peu l'inglishe, je te rappelle l'existence de la FAQ

        http://www.parashift.com/c++-faq/

        et de l'anti-FAQ

        http://yosefk.com/c++fqa/defective.html

        qui explique pourquoi C++ est un langage tout pourri. (Ce qui n'empêche pas qu'on puisse avoir de bonnes raisons d'écrire un programme avec. Signé: un développeur C++.) C'est une lecture intéressante à cause de tous les pièges du langage qu'elle met en avant. Le premier document est la FAQ du Usenet comp.lang.c++ et a une version LITE.

  • # Notaire

    Posté par  (site web personnel) . Évalué à 1.

    Bonjour,

    Pour les problèmes d'héritage je vous conseil de voir un notaire.

    • [^] # Re: Notaire

      Posté par  . Évalué à 0.

      aucun rapport donc j'"inutile" meme si j'ai bien ri ;)

    • [^] # Re: Notaire

      Posté par  . Évalué à 0.

      Je pense que former des professeurs d'informatique pour le lycée serait bien plus efficace !

      (Mon professeur d'info était un professeur de math et physique. Après mon premier semestre en seconde, j'étais aussi compétent que lui. En première, c'est moi qui lui expliqué des programmes.
      Après, il était vraiment très compétent en math et physique. C'est juste qu'il n'est pas prof d'info. )

      • [^] # Re: Notaire

        Posté par  . Évalué à 0.

        par contre en francais, t'as manqué des cours ? ;)

        (Mon professeur d'info était un professeur de math et physique. Après mon premier semestre en seconde, j'étais aussi compétent que lui. En première, c'est moi qui lui expliqué expliquais des programmes.

        • [^] # Re: Notaire

          Posté par  . Évalué à -1.

          C'était un lycée allemand (un Gymnasium) :P

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.