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 :

[PROBLEME] Déclaration pointeur static sur Class Modele


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 49
    Par défaut [PROBLEME] Déclaration pointeur static sur Class Modele
    Bonjour,

    Je souhaite créer une classe modèle. A l'école on m'a appris cette méthode. On déclarer un pointeur static dans la classe et on crée une fonction static Mdl() qui renvoie ce pointeur. Cela permet de n'avoir qu'à instancier une seule fois la classe pour pouvoir l'utiliser dans tout le code. Très pratique !
    Mais voilà le problème, j'ai fait ces solutions sur Java et C# et en C++ je suis confronté à un petit problème.

    Voilà ma classe.hpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Controler
    {
    	private:
    	static Controler* mdl;
     
    ...
     
    	static Controler* Mdl(void);
     
    };
    Et une partie du .cpp

    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
     
    #include "Controler.hpp"
     
    using namespace std;
    using namespace sf;
     
    //Controler::mdl = NULL;
     
    Controler::Controler()
    {
    	mdl = this;
    }
     
    Controler* Controler::Mdl()
    {
    	return mdl;
    }
    Voilà le problème. J'ai appris qu'une variable static devait toujours être obligatoirement initialisée sinon le linker hurle.

    Si je commente Controler::mdl = NULL; le linker hurle effectivement ceci :

    Erreur 2 fatal error LNK1120: 1 externes non résolus C:\Users\Tbop\Documents\Visual Studio 2008\Projects\GameEngine\Debug\GameEngine.exe
    Erreur 1 error LNK2001: symbole externe non résolu "private: static class Controler * Controler::mdl" (?mdl@Controler@@0PAV1@A) Controler.obj
    Si au contraire je décommente il me hurle ceci :

    Erreur 1 error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut c:\users\tbop\documents\visual studio 2008\projects\gameengine\gameengine\controler.cpp 6
    Erreur 2 error C2040: 'mdl'*: les niveaux d'indirection de 'int' et de 'Controler *' sont différents c:\users\tbop\documents\visual studio 2008\projects\gameengine\gameengine\controler.cpp 6
    Je tourne en rond et je ne sais vraiment plus quoi faire !

    Merci de votre aide

  2. #2
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 49
    Par défaut
    C'est bon j'ai trouvé le problème.

    La solution est qu'il faut redéfinir le type de la variable static quand on l'initialise à l'extérieur :

    Controler* Controler::mdl = NULL;

  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,
    Il faut effectivement rappeler le type de la variable.
    Cependant, on dit souvent des bêtises à l'école et je suis dubitatif face à cette approche avec des variables statiques.
    En gros, tu as fait plus ou moins un singleton, et voici une bonne critique de cette approche : Etes-vous atteint de Singletonite ?

  4. #4
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 49
    Par défaut
    Oui c'est ça, du coup j'ai appris le mot en même temps que la solution hier sur internet. C'est une sorte de singleton en effet. Sauf qu'il n'est pas encore sécurisé avec des constructeurs privés... Ce que je m'apprête à faire pour avoir un code toujours plus propre.

    Je vais par ailleurs lire de ce pas ton article !

    Merci !

  5. #5
    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,
    Dis autrement, avoir des singletons pour retrouver le modèle depuis le contrôleur est absurde. Comment vas-tu faire si tu as plusieurs documents avec chacun leur contrôleur ?
    Autre question : pourquoi ton contrôleur doit-il retourner le modèle ?

  6. #6
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 49
    Par défaut
    Il ne retourne pas le modèle. Il retourne juste son pointeur. J'ai la facheuse habitude d'appeler ça Mdl à chaque fois mais ce n'est pas le cas.

    En fait je suis actuellement en train de repenser une architecture plus intelligente à l'heure actuelle.

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

Discussions similaires

  1. petit probleme de pointeur dans strcat sur le projet de mes etudiant
    Par hamhama-group dans le forum Bibliothèque standard
    Réponses: 8
    Dernier message: 04/12/2007, 18h34
  2. Réponses: 4
    Dernier message: 15/10/2006, 18h05
  3. Problème de pointeurs sur classe
    Par fabiin dans le forum Delphi
    Réponses: 1
    Dernier message: 05/08/2006, 18h13
  4. pointeur membre static de classe
    Par Ca$ul dans le forum C++
    Réponses: 3
    Dernier message: 26/08/2004, 13h02
  5. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26

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