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

Langage C++ Discussion :

Héritage, template et compilation


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Par défaut Héritage, template et compilation
    Bonjour,

    Je suis à la recherche d'une aide pour le problème suivant.

    J'ai une classe A comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class A
    {
    public:
    A();
    ~A();
     
    protected:
    unsigned int _nbData;
    };
    Une classe B:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template <class T>
    class B<T> : public A
    {
    public
    B();
    ~B();
    };
    Et une classe C:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template <class T>
    class C<T> : public B<T>
    {
    public:
    C();
    ~ C();
    };
    Dans le code de la class C j'utilise la variable _nbData de le manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void C::maFonction(unsigned int nb)
    {
    _nbData = nb;
    }
    Le compilateur me renvoie la message d'erreur suivant:
    erreur: ‘_nbData’ was not declared in this scope
    Ce qui signifie qu'il ne voit pas la variable pourtant héritée de la classe parente.

    Bien sûr, ca compile bien avec visual studio

    Merci pour votre aide!

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Letinono Voir le message
    Bonjour,

    Je suis à la recherche d'une aide pour le problème suivant.

    J'ai une classe A comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class A
    {
    public:
    A();
    ~A();
     
    protected:
    unsigned int _nbData;
    };
    Une classe B:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template <class T>
    class B : public A
    {
    public
    B();
    ~B();
    };
    Et une classe C:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template <class T>
    class C : public B<T>
    {
    public:
    C();
    ~ C();
    };
    Dans le code de la class C j'utilise la variable _nbData de le manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void C::maFonction(unsigned int nb)
    {
    _nbData = nb;
    }
    Le compilateur me renvoie la message d'erreur suivant:


    Ce qui signifie qu'il ne voit pas la variable pourtant héritée de la classe parente.

    Bien sûr, ca compile bien avec visual studio

    Merci pour votre aide!
    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
     
    template <class T> class B : public A
    {
    protected:
      using A::_nbdata;
    public
      B();
      ~B();
    };
     
    template <class T> class C : public B<T>
    {
    protected:
      using B<T>::_nbdata;
    public:
      C();
      ~C();
    };
    ?

    Attention tout de même : B<T> peut être spécialisée et ne PAS définir _nbdata.
    Ensuite, les noms qui commencent avec un _ sont a éviter. (_ + majuscule == réservé ; __ == réservé ; _ + minuscule = pas beau à lire )
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    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
    Par défaut
    Salut,
    Cas particulier d'un où il faut utiliser this
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    class A
    {
    public:
    A():nbData(0){}
    virtual ~A(){}
     
    protected:
    unsigned int nbData;
    };
     
    template <class T>
    class B : public A
    {
    public:
    };
     
    template <class T>
    class C : public B<T>
    {
    public:
     
        void maFonction(unsigned int nb)
        {
            this->nbData = nb;
        }
     
    };
     
    int main(int argc, char* argv[])
    {
        C<int> a;
        a.maFonction(0);
      return 0;
    }
    J'ajouterai aux remarques d'Emmanuel de ne pas oublier les destructeurs virtuels.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Cas particulier d'un où il faut utiliser this
    J'aimerais bien comprendre pourquoi.

  5. #5
    screetch
    Invité(e)
    Par défaut
    le compilateur lors de la compilation n'a aucune idée de ce que pourrait être nbData; si tu lui dis this-> alors tu lèves le doute du compilateur.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Le doute entre quoi et quoi ?

    nbData n'est dépendant d'aucun template.

    Quel que soit le type fourni au template de C, et donc de B, C aura un membre nbData de type int. Ca, le compilateur peur le savoir.

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

Discussions similaires

  1. héritage template virtual destructeur
    Par ziker dans le forum Langage
    Réponses: 7
    Dernier message: 26/11/2011, 20h27
  2. héritage template ,compilation
    Par carton99 dans le forum Débuter
    Réponses: 2
    Dernier message: 11/04/2010, 17h46
  3. héritage template (en guise de typedef)
    Par adrtod dans le forum Langage
    Réponses: 5
    Dernier message: 08/04/2010, 10h19
  4. Réponses: 8
    Dernier message: 18/06/2007, 15h06
  5. Classe template - erreur compilation
    Par Rodrigue dans le forum Langage
    Réponses: 5
    Dernier message: 06/07/2006, 17h26

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