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 :

singleton déjà défini dans singleton.obj


Sujet :

C++

  1. #1
    Acropole
    Invité(e)
    Par défaut singleton déjà défini dans singleton.obj
    bonjour,

    J'essaye de créer un singleton mais j'ai les erreurs suivantes :

    cSpectatorController.obj : error LNK2005: "private: static class cApplication * cApplication::_singleton" (?_singleton@cApplication@@0PAV1@A) déjà défini(e) dans cApplication.obj
    main.obj : error LNK2005: "private: static class cApplication * cApplication::_singleton" (?_singleton@cApplication@@0PAV1@A) déjà défini(e) dans cApplication.obj
    voici le code de mon singleton :

    .h

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    #ifndef _APPLICATION_
    #define _APPLICATION_
     
    #include <Ogre.h>
    #include <OIS/OIS.h>
    #include <CEGUI/CEGUI.h>
    #include <OgreCEGUIRenderer.h>
     
    #include "cInputListener.h"
    #include "cPlayerController.h"
     
    #include "NxPhysics.h"
     
    using namespace Ogre;
     
     
    class cApplication
    {
    private:
    	static cApplication *_singleton;
     
    	Root *mRoot;
    	OIS::Keyboard *mKeyboard;
    	OIS::Mouse * mMouse;
    	OIS::InputManager *mInputManager;
     
    	CEGUI::OgreCEGUIRenderer *mRenderer;
    	CEGUI::System *mSystem;
     
    	cInputListener* mListener;
    	cPlayerController* mPlayerController;
    	FrameListener* mPlayerFrameListener;
     
    	NxPhysicsSDK* mPhysXSDK;
    	NxScene * mPXScene;
     
    	void createRoot();
        void defineResources();
        void setupRenderSystem();
        void createRenderWindow();
        void initializeResourceGroups();
        void setupScene();
    	void setupInputSystem();
    	void createGUI();
        void setupCEGUI();
        void createFrameListener();
        void startRenderLoop();
    	void addPlayer();
    	void setupPhysics();
    	cApplication(void);
    	~cApplication(void);
     
    public:
    	inline Root* getRoot(){ return mRoot; }
    	inline OIS::Keyboard * getKeyBoard(){ return  mKeyboard; }
    	inline OIS::Mouse * getMouse(){ return mMouse;}
    	inline OIS::InputManager * getInputManager(){ return mInputManager; }
     
    	inline CEGUI::OgreCEGUIRenderer * getRenderer() { return mRenderer; }
    	inline CEGUI::System * getSystem() { return  mSystem; }
     
    	inline NxPhysicsSDK* getPhysxSDK() { return  mPhysXSDK; }
    	inline NxScene * getPhysxScene() { return  mPXScene; }
     
    	static cApplication* getSingletonPtr();
    	static void kill ();
    	void go();
    };
    cApplication *cApplication::_singleton = 0;
     
    #endif
    .cpp (je vous passe toutes les autres fonctions)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    cApplication* cApplication::getSingletonPtr(){
    	if (_singleton == 0)
    		_singleton =  new cApplication;
    	return _singleton;
    }
     
    void cApplication::kill ()
    {
    	if (_singleton != 0)
    	  {
    		delete _singleton;
    		_singleton = NULL;
    	  }
    }
    et les deux appels :

    main.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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include "cApplication.h"
     
    #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
    #define WIN32_LEAN_AND_MEAN
    #define NOMINMAX
    #include "windows.h"
     
    INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
    #else
    int main(int argc, char **argv)
    #endif
    {
        // Create application object
        try {
    		cApplication* app = cApplication::getSingletonPtr();
    		app->go();
        } catch( Exception& e ) {
    #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 
            MessageBox( NULL, e.what(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
    #else
            fprintf(stderr, "An exception has occurred: %s\n",
                    e.what());
    #endif
        }
     
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	if(mMouse->getMouseState().buttonDown(OIS::MouseButtonID::MB_Left)){
    		cApplication::getSingletonPtr();
    	}
    Il me semble pourtant avoir respecté scrupuleusement les indications des différents tutos que j'ai trouvé, mais rien n'y fait.

    merci

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    La réponse est dans cette entrée de la FAQ.

    Sinon je suggérerais, avis personnel, de plus simplement ne pas faire de singleton, en général c'est non seulement inutile mais ça crée plus de problèmes qu'on croit que ça en résout.
    Je sais qu'Ogre et consorts en sont plein mais bon... Bref...

    MAT.

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 723
    Par défaut
    La dernière ligne du .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cApplication *cApplication::_singleton = 0;
    devrait être dans le fichier cApplication.cpp

    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Acropole
    Invité(e)
    Par défaut
    Merci.

    Je le sais en plus qu'il faut l'initialiser ailleurs, mais j'étais tellement focalisé sur cette nouveauté qu'est le singleton que ça m'est même pas venu a l'esprit.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 723
    Par défaut
    Citation Envoyé par Acropole Voir le message
    Merci.

    Je le sais en plus qu'il faut l'initialiser ailleurs, mais j'étais tellement focalisé sur cette nouveauté qu'est le singleton que ça m'est même pas venu a l'esprit.
    Tu ne l'initialises pas "ailleurs", tu réserves la place qu'il a besoin "ailleurs" que dans le .h car sinon, celle ci va être allouée dans tous les modules qui vont l'inclure (et çà rale à l'edition de liens)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Méthode dans Singleton
    Par Narvis dans le forum Langage
    Réponses: 3
    Dernier message: 07/06/2012, 11h26
  2. Fonction singleton déclarer dans header et définie dans le cpp
    Par david lefaivre dans le forum Langage
    Réponses: 3
    Dernier message: 20/02/2012, 02h19
  3. [MySQL] Récupérer les valeurs définies dans un champ ENUM
    Par Huntress dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 03/07/2010, 18h55
  4. lien popup href défini dans javascript mé pas visibdans page
    Par Yoyo_galère dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 13/01/2005, 14h43
  5. Utilisation fonction définie dans un .Dll
    Par jeab. dans le forum Windows
    Réponses: 5
    Dernier message: 23/03/2004, 16h23

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