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 :

Fonction singleton déclarer dans header et définie dans le cpp


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 28
    Points : 20
    Points
    20
    Par défaut Fonction singleton déclarer dans header et définie dans le cpp
    Salut,

    J'ai une petite question. Ça fait longtemps que j'ai fait du c++ et j'ai oublié comment on fait (si c'est possible) pour déclarer une fonction static dans le header et la définir dans le cpp d'implémentation. En fait, j'aimerais faire une classe singleton et j'ai abouti avec le code suivant :

    header:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Yo
    {
    	private:
    		Yo();
     
    	public:
    		static Yo* getInstance();
     
    	private:
    		static Yo* instance;
    };
    cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Yo* Yo::getInstance()
    {
    	if (instance == NULL)
    		instance = new Yo;
     
    	return instance;
    }
    Le problème est que ce bout de code ne compile pas. J'ai une erreur de linkage, en fait.

    Error 1 error LNK2001: unresolved external symbol "public: static class Yo * __cdecl Yo::getInstance(void)" (?getInstance@Yo@@SAPAV1@XZ)
    Pour ce que j'en comprend, la function instance ne semble pas être reconnue. Je supposes que le problème est que la méthode getInstance est static. Donc, je réitère ma question : Comment on fait (si c'est possible) pour déclarer une fonction static dans le header (le prototype) et la définir (le corps de la fonction) dans le cpp d'implémentation ?

    Merci

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Points : 2 502
    Points
    2 502
    Par défaut
    Bonsoir,

    Le message d'erreur n'est pas explicite. Mais ce qu'il manque c'est l'initialisation du pointeur static Yo* instance;.
    Pour ne pas se compliquer la vie sur l'allocation/libération de mémoire, je suggère ceci.

    .CPP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Yo Yo::instance;
     
    Yo* Yo::getInstance()
    {
    	return &instance;
    }
    .H
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Yo
    {
        private:
        		Yo(){};
    	public:
    		static Yo* getInstance();
    	private:
    		static Yo instance;
    };
    Autre solution avec une référence et variable statique dans getInstance : FAQ Singleton

  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,

    - Il manque la définition de la variable statique membre
    - Il manque l'interdiction de la copie (opérateur = et constructeur de copie privés ou =delete si C++11)
    - Si l'allocation peut être dynamique, il vaut mieux retourner un objet par référence static Yo& getInstance();.
    - Pour rappel, ce genre de création n'est pas thread-safe (et ne peux l'être en c++03)
    - Pour rappel, les singletons peuvent être considérés un anti-pattern (c'est exactement les mêmes inconvénients qu'une variable globale)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    Merci pour la réponse.

Discussions similaires

  1. Réponses: 7
    Dernier message: 11/08/2011, 19h29
  2. Réponses: 10
    Dernier message: 15/06/2011, 11h30
  3. Réponses: 2
    Dernier message: 30/04/2010, 20h40
  4. Réponses: 6
    Dernier message: 21/07/2009, 11h37
  5. Réponses: 1
    Dernier message: 27/05/2009, 09h19

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