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 :

Template et héritage


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut Template et héritage
    Bonjour à tous, je suis confronté au problème suivant.
    Je dispose d'une classe qui est un template et qui définit un Multiton:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    template<typename T>
        class Multiton
        {
            public:
     
                /*! \brief Retourne l'instance spécifiée de la classe */
                static T* instance( const int pId )
                {...}
    ..............
    }
    Je veux écrire une classe qui dérive de ce template, mais qui reste abstraite, avec des fonctions virtuelles pures:
    OperModeManagerGeneric. Cette classe ne sera pas instanciable du fait de ses fonctions vp, donc j'en fais également un template, qui sera donc délégué au Multiton:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     template<typename U>
        /*!
         * \brief Cette classe définit le socle d'un manager d'oper modes
         */
        class OperModeManagerGeneric : public Multiton<U>
        {
            public:
                 .....
                  virtual void fonctionAReimplementer() = 0 ;
                 ...........
    }
    De fait, je voudrais dans du code plus spécifique avoir une classe qui dérive de OperModeManagerGeneric, comme par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        class OperModeManager : public OperModeManagerGeneric<OperModeManager>
        {
     
            public:
                 .....
                  virtual void fonctionAReimplementer();
                 ...........   
    }
    Et ainsi, mon OperModeManager peut hériter de OperModeManagerGeneric en concrétisant le template, qui concrétise en meme temps le template du Multiton.

    Est-ce que tout ceci est possible ?

    Et par ailleurs, j'ai d'autres classes qui doivent se servir d'un pointeur sur un OperModeManagerGeneric, voici un exemple:

    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
     
    template<typename W>
     
        class OperModeFinalState
        {
     
            public:
     
     
                explicit OperModeFinalState ( const OperModeManagerGeneric<W>* pParent, );
     
            protected:
     
              .....
     
            private:
     
                const OperModeManagerGeneric<W>* mParent;        //!< Machine a état parent
     
        };
    Est-ce que c'est bon ?

    Côté implémentation du constructeur, j'ai écrit ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     OperModeFinalState<class W>::OperModeFinalState ( const OperModeManagerGeneric<class W>* pParent ) :
            mParent( pParent )
        {
        }
    Ca ne compile pas ==> opermodefinalstate.cpp:30: erreur: too few template-parameter-lists

    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template<typename W>
        OperModeFinalState<W>::OperModeFinalState ( const OperModeManagerGeneric<W>* pParent, QState* pParentState ) :
            QFinalState( pParentState ),
            mParent( pParent )
        {
        }
    Est-ce que ce code serait meilleur ?
    (En gros pour le moment je ne compile pas pour d'autre raison, mais je ne pense pas que la façon se faire soit bonne ?).

    Merci pour l'aide, gros cafouillage de ma part !

  2. #2
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    Re bonjour,

    en fait je n'ai plus qu'une erreur de link, si par exemple j'ai la fonction void manageMastPowering(); définie telle que:

    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
     
     class OperModeManagerGeneric : public Multiton<U>
        {
            public:
     
                friend class Multiton<U>;
     
                /*!
                 * \brief Constructeur utilisé dans le multiton
                 */
                OperModeManagerGeneric ( int pId );
     
                /*!
                 * \brief Destructeur.
                 */
                virtual ~OperModeManagerGeneric ();
     
                void manageMastPowering();
    };
    J'ai donc mon OperModeManager (namespace smov) qui hérite de OperModeManagerGeneric (namespace movsomapscommon), et lorsque je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    OperModeManager::instance( mScreenId )->manageMastPowering();
    J'ai l'erreur suivante:

    undefined reference to `movsomapscommon::OperModeManagerGeneric<smov::OperModeManager>::manageMastPowering()'
    J'ai défini le manageMastPowering dans OperModeManagerGeneric comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template<typename U>
        void OperModeManagerGeneric<U>::manageMastPowering()
        {
          ..............
        }

    C'est pt etre l'implémentation qui ne va pas ?

    Merci

  3. #3
    Membre confirmé Avatar de KsassPeuk
    Homme Profil pro
    Ingénieur Chercheur
    Inscrit en
    Juillet 2013
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Chercheur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 138
    Points : 635
    Points
    635
    Par défaut
    Lu'!

    Beaucoup de pointeurs (nus) là dedans, j'espère que c'est justifié sinon tu vas vite te retrouver avec une usine à gaz ingérable.

    Sinon, il y a trop de peu de code (et pas assez d'explication sur son organisation) pour répondre. A tout hasard, tu n'aurais pas séparé l'implémentation et la déclaration d'éléments template en header/source ? (Rappel : template sauf cas particulier : tout en header - éventuellement séparé + inclusion).

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 068
    Points : 12 111
    Points
    12 111
    Par défaut
    manageMastPowering n'est pas template dans la déclaration mais template dans la définition => y a une couille dans le potage.

  5. #5
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    Non : manageMastPowering n'est pas template..... c'est la classe qui le porte qui est template.


    Un grand merci à KsassPeuk qui m'a sauvé: effectivement (je n'avais jamais utilisé les templates) mais la déclaration et la définition du code ne peuvent se situer qu'au meme endroit, en l'occurrence j'ai mis mon code dans le .h et ça marche.
    Grace à toi j'ai fait une petite recherche et je suis tombé sur ce lien très explicatif:
    http://www.codeproject.com/Articles/...h-file-and-imp

    Et maintenant j'ai compris

    Merci !
    A+

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 960
    Points
    32 960
    Billets dans le blog
    4
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Template et héritage
    Par Ulmo dans le forum Langage
    Réponses: 16
    Dernier message: 08/03/2009, 23h41
  2. Template et héritage
    Par rooger dans le forum Langage
    Réponses: 5
    Dernier message: 22/07/2008, 13h48
  3. Foncteur, classes templates et héritage
    Par Floréal dans le forum C++
    Réponses: 8
    Dernier message: 17/06/2007, 21h56
  4. Template ou héritage
    Par bolhrak dans le forum Langage
    Réponses: 6
    Dernier message: 22/12/2006, 11h22
  5. patron, templates et héritages!
    Par kleenex dans le forum C++
    Réponses: 4
    Dernier message: 05/06/2006, 22h57

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