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++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Points : 59
    Points
    59
    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
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 4 551
    Points
    4 551
    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
    Points : 13 017
    Points
    13 017
    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 émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    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 émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    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.

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par oodini Voir le message
    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.
    Pour C<T>, l'existence de _nbdata est dépendante de l'implémentation de B<T>, qui est une classe template, et qui peut donc être spécialisée et ne pas définir ce _nbdata, ou pour le définir autrement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template <>
    class B<float>
    {
    ...
    };
    Et voilà. Une spécialisation de template qui élimine le lien héritage, donc l'existence de _nbdata dans B<float>
    [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.

  8. #8
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Et voilà. Une spécialisation de template qui élimine le lien héritage, donc l'existence de _nbdata dans B<float>
    ce qui n'est pas le pire; ma classe est encore plus pire que la tienne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <>
    class B<float>
    {
      typedef int nbData;
    };
    gnihihihihi

    c'est là qu'est le doute

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template <>
    class B<float>
    {
    ...
    };
    Et voilà. Une spécialisation de template qui élimine le lien héritage, donc l'existence de _nbdata dans B<float>
    Serais-tu en train de dire que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template <>
    class B<float>
    {...};
    est une spécialisation de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template <T>
    class B<T> : public A
    {...};
    ?

    Pour moi, les deux n'ont rien à voir (mais je peux me tromper).
    Mais il est clair qu'on les instancie de la même manière...

  10. #10
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par oodini Voir le message
    Serais-tu en train de dire que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template <>
    class B<float>
    {...};
    est une spécialisation de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template <T>
    class B : public A
    {...};
    ?

    Pour moi, les deux n'ont rien à voir (mais je peux me tromper).
    Mais il est clair qu'on les instancie de la même manière...
    B<float> est une spécialisation de B<T>, et B<T> est l'implémentation générale. Du coup, C<float> va hériter de B<float>, qui n'héritera pas de A.

    Petit rappel : la déclaration de la classe B est :

    template <class T> class B;

    Pas

    template <class T> class B<T>;

    qui est la déclaration d'une spécialisation partielle (invalide dans ce cas).
    [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.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    J'avoue que j'ai du mal à vous suivre, mais je vous remercie beaucoup cela fonctionne!

+ 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