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

Discussion :

Singleton et héritage, membres statiques donnant des erreur à l'édition des liens

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Singleton et héritage, membres statiques donnant des erreur à l'édition des liens
    Bonjour à tous !

    Je suis en train d'améliorer mon lot d'outils et j'ai pensé me faire une classe Singleton. J'ai suivi le tutoriel ici et je n'arrive pas à instancier ma classe. J'ai les erreurs suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    main.o: In function `cbl::Singleton<cbl::LonelyClass>::getInstance()':
    /home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:18: undefined reference to `cbl::Singleton<cbl::LonelyClass>::m_instance'
    /home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:19: undefined reference to `cbl::Singleton<cbl::LonelyClass>::m_instance'
    /home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:20: undefined reference to `cbl::Singleton<cbl::LonelyClass>::m_instance'
    main.o: In function `cbl::Singleton<cbl::LonelyClass>::kill()':
    /home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:22: undefined reference to `cbl::Singleton<cbl::LonelyClass>::m_instance'
    /home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:23: undefined reference to `cbl::Singleton<cbl::LonelyClass>::m_instance'
    main.o:/home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:24: more undefined references to `cbl::Singleton<cbl::LonelyClass>::m_instance' follow
    collect2: ld a retourné 1 code d'état d'exécution
    J'ai rassemblé pour vous un code minimal :

    pattern.hpp:
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #ifndef PATTERN_HPP
    #define PATTERN_HPP
     
    #include "libcbl-shared_global.h"
     
    using namespace std;
    namespace cbl{
     
    template <typename T> class LIBCBLSHAREDSHARED_EXPORT Singleton
    {
    /*  Use by declaring a subclass, i.e.
     *    class UniqueObject : public Singleton<UniqueObject>{};
     */
    public:
      static T *getInstance(){
        if( m_instance == NULL )
          m_instance = new T;
        return ( static_cast<T*> (m_instance) );
      }
     
      static void kill(){
        if( m_instance != NULL ){
          delete m_instance;
          m_instance = NULL;
        }
      }
     
    protected:
      Singleton (){}
      ~Singleton(){}
     
    private:
      static T * m_instance;
    };  // class Singleton
     
    class LIBCBLSHAREDSHARED_EXPORT LonelyClass
        : public Singleton<LonelyClass>
    {
      friend class Singleton<LonelyClass>;
     
    private:
      LonelyClass(){}
      ~LonelyClass(){}
     
    };   // class LonelyClass
     
    // LA SOLUTION AU PROBLEME EST LES DEUX LIGNES SUIVANTES
    template <typename T>
    T *Singleton<T>::m_instance = NULL;
     
    }   // namespace cbl
    #endif // PATTERN_HPP
    main.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <pattern.hpp>
    using namespace cbl;
    int main()
    {
      LonelyClass *fh;
      fh = LonelyClass::getInstance();
      fh->kill();
      return 0;
    }
    Avez-vous un indice ?

    EDIT :
    Le code ci-dessous contient la solution (fichier pattern.hpp). La réponse se trouvait dans la FAQ C++ : dans la section des erreurs générées par des membres statiques.

    Le titre à été modifié pour mieux décrire le problème.

    Merci !

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonjour,

    Ce n'est pas un problème de code mais un problème de linkage. Pouvez-vous montrer votre Makefile ?

    Bonne continuation,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je pense que c'est simplement à cause de ceci : http://cpp.developpez.com/faq/cpp/?p..._static_erreur
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Je pense que c'est simplement à cause de ceci : http://cpp.developpez.com/faq/cpp/?p..._static_erreur
    En effet. De plus, dans le tutoriel que j'ai suivi, cette initialisation était incluse. J'ai donc simplement ajouté les lignes suivantes à mon fichier pattern.hpp (à l'intérieur d'un namespace, après la définition de la classe)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <typename T>
    T *Singleton<T>::m_instance = NULL;
    Ce n'est pas un problème de code mais un problème de linkage. Pouvez-vous montrer votre Makefile ?
    J'aurais trouvé ça dommage de devoir régler mon problème via une édition du Makefile, étant donné qu'il est généré automatiquement par qmake. Merci de votre intervention quand même .

    Merci à vous deux !

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 21/07/2008, 12h45
  2. Erreur à l'édition des liens
    Par biloute555 dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 17/05/2008, 11h46
  3. Réponses: 0
    Dernier message: 20/07/2007, 13h40
  4. Erreur à l'édition des liens en mode release
    Par Deydey dans le forum Visual C++
    Réponses: 3
    Dernier message: 16/04/2007, 14h56
  5. [VC++] Erreur d'édition des liens LNK1143
    Par Yellowmat dans le forum MFC
    Réponses: 6
    Dernier message: 01/02/2006, 15h00

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