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 :

Petit problême de construction


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 136
    Par défaut Petit problême de construction
    Bonjour,
    Alors voilà j'ai un problême assez ennuyant quand j'essaie de construire de construire mon projet...

    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
    Linking console executable: OlalaProject.exe
    .objs\important.o:important.cpp:(.text+0x176): undefined reference to `Singleton<jeu>::getInstance()'
    .objs\important.o:important.cpp:(.text+0x19e): undefined reference to `Singleton<actualisation>::m_instance'
    .objs\important.o:important.cpp:(.text+0x24f): undefined reference to `Singleton<actualisation>::Singleton()'
    .objs\important.o:important.cpp:(.text+0x273): undefined reference to `Singleton<actualisation>::Singleton()'
    .objs\important.o:important.cpp:(.text+0x297): undefined reference to `Singleton<actualisation>::~Singleton()'
    .objs\important.o:important.cpp:(.text+0x2ab): undefined reference to `Singleton<actualisation>::~Singleton()'
    .objs\important.o:important.cpp:(.text+0x2ce): undefined reference to `Singleton<ecran>::m_instance'
    .objs\important.o:important.cpp:(.text+0x34d): undefined reference to `Singleton<ecran>::Singleton()'
    .objs\important.o:important.cpp:(.text+0x361): undefined reference to `Singleton<ecran>::Singleton()'
    .objs\important.o:important.cpp:(.text+0x375): undefined reference to `Singleton<ecran>::Singleton()'
    .objs\important.o:important.cpp:(.text+0x39b): undefined reference to `Singleton<ecran>::Singleton()'
    .objs\important.o:important.cpp:(.text+0x3c1): undefined reference to `Singleton<ecran>::~Singleton()'
    .objs\important.o:important.cpp:(.text+0x3d5): undefined reference to `Singleton<ecran>::~Singleton()'
    .objs\jeu.o:jeu.cpp:(.text+0x16e): undefined reference to `Singleton<jeu>::m_instance'
    .objs\jeu.o:jeu.cpp:(.text+0x239): undefined reference to `Singleton<jeu>::Singleton()'
    .objs\jeu.o:jeu.cpp:(.text+0x24d): undefined reference to `Singleton<jeu>::Singleton()'
    .objs\jeu.o:jeu.cpp:(.text+0x261): undefined reference to `Singleton<jeu>::~Singleton()'
    .objs\jeu.o:jeu.cpp:(.text+0x275): undefined reference to `Singleton<jeu>::~Singleton()'
    .objs\jeu.o:jeu.cpp:(.text+0x284): undefined reference to `Singleton<commandes>::m_instance'
    .objs\jeu.o:jeu.cpp:(.text+0x30d): undefined reference to `Singleton<commandes>::Singleton()'
    .objs\jeu.o:jeu.cpp:(.text+0x321): undefined reference to `Singleton<commandes>::Singleton()'
    .objs\jeu.o:jeu.cpp:(.text+0x335): undefined reference to `Singleton<commandes>::~Singleton()'
    .objs\jeu.o:jeu.cpp:(.text+0x349): undefined reference to `Singleton<commandes>::~Singleton()'
    .objs\main.o:main.cpp:(.text+0x191): undefined reference to `Singleton<actualisation>::getInstance()'
    .objs\main.o:main.cpp:(.text+0x201): undefined reference to `setLargeurHauteur(int, int)'
    .objs\main.o:main.cpp:(.text+0x22e): undefined reference to `keyboardFunc(unsigned char, int, int)'
    .objs\main.o:main.cpp:(.text+0x23d): undefined reference to `mouseFunc(int, int, int, int)'
    .objs\main.o:main.cpp:(.text+0x24c): undefined reference to `motionFunc(int, int)'
    .objs\redirection.o:redirection.cpp:(.text+0x18a): undefined reference to `Singleton<commandes>::getInstance()'
    .objs\redirection.o:redirection.cpp:(.text+0x1ef): undefined reference to `Singleton<commandes>::getInstance()'
    .objs\redirection.o:redirection.cpp:(.text+0x250): undefined reference to `Singleton<commandes>::getInstance()'
    .objs\redirection.o:redirection.cpp:(.text+0x29e): undefined reference to `Singleton<ecran>::getInstance()'
    .objs\redirection.o:redirection.cpp:(.text+0x2de): undefined reference to `Singleton<actualisation>::getInstance()'
    .objs\redirection.o:redirection.cpp:(.text+0x30e): undefined reference to `Singleton<jeu>::getInstance()'
    .objs\son.o:son.cpp:(.text+0x171): undefined reference to `Singleton<son>::m_instance'
    .objs\son.o:son.cpp:(.text+0x1d9): undefined reference to `Singleton<son>::Singleton()'
    .objs\son.o:son.cpp:(.text+0x239): undefined reference to `Singleton<son>::~Singleton()'
    .objs\son.o:son.cpp:(.text+0x2ab): undefined reference to `Singleton<son>::Singleton()'
    .objs\son.o:son.cpp:(.text+0x30b): undefined reference to `Singleton<son>::~Singleton()'
    .objs\son.o:son.cpp:(.text+0x388): undefined reference to `Singleton<son>::m_instance'
    .objs\son.o:son.cpp:(.text+0x3af): undefined reference to `Singleton<son>::~Singleton()'
    .objs\son.o:son.cpp:(.text+0x3d9): undefined reference to `Singleton<son>::~Singleton()'
    .objs\son.o:son.cpp:(.text+0x43e): undefined reference to `Singleton<son>::m_instance'
    .objs\son.o:son.cpp:(.text+0x465): undefined reference to `Singleton<son>::~Singleton()'
    .objs\son.o:son.cpp:(.text+0x48f): undefined reference to `Singleton<son>::~Singleton()'
    Voilà je n'ai pas réussi à comprendre pourquoi toute la classe Singleton bug et pourquoi 2-3 fonctions aussi (qui n'ont rien à voir)...

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Toutes les classes de ton projets sont complilées et linkées ensemble ?

    Peut être qu'il te faut aussi forcer une reconstruction totale de ton projet
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Une instance statique dans une classe template qui soit générée automatiquement pour toute spécialisation déclarée dans le projet? C'est possible ça?
    Sinon, j'ai comme l'impression que tu as aussi déclaré les méthodes de ta classe Singleton dans un fichier .cpp...

  4. #4
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    Tu pourrais montrer le code du fichier dans lequel tu instancie les membres statiques de ta classe ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 136
    Par défaut
    Voilà le code de global.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
    #ifndef _GLOBAL_
    #define _GLOBAL_
     
    #include <iostream>
    #include <string>
    #include <list>
    #include <fstream>
    #include <time.h>
    #include <windows.h>
    #include <GL/glut.h>
     
    template <class T> class Singleton
    {
        public:
        static T* getInstance();
        static void kill();
     
        protected:
        Singleton();
        ~Singleton();
        static T* m_instance;
    };
     
    #endif
    Tous les includes sont destinés au reste du programme.

    Ensuite voilà global.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
    28
    29
    30
    31
    #include "global.h"
     
    template <class T> T* Singleton<T>::m_instance = NULL;
     
    template <class T> T* Singleton<T>::getInstance()
    {
        if(m_instance == NULL)
        {
            m_instance = new T;
        }
     
        return m_instance;
    }
     
    template <class T> void Singleton<T>::kill()
    {
        if(m_instance != NULL)
        {
            delete m_instance;
        }
    }
     
    template <class T> Singleton<T>::Singleton()
    {
        m_instance = static_cast<T>(this);
    }
     
    template <class T> Singleton<T>::~Singleton()
    {
        m_instance = NULL;
    }
    J'ai relu plusieurs fois mais je n'ai rien trouvé...

  6. #6
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Au choix tu peux :
    • mettre les définitions dans le .h
    • renommer ton .cpp en .inl, supprimer l'include du .h et mettre un include du .inl dans le .h (voir faq c++)
    • faire une instanciation explicite de ton template
    • utiliser une classe de singleton déjà écrite (loki, boost?)

    a++

  7. #7
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Citation Envoyé par Plomeg Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #ifndef _GLOBAL_
    #define _GLOBAL_
     
    #include <iostream>
    #include <string>
    #include <list>
    #include <fstream>
    #include <time.h>
    #include <windows.h>
    #include <GL/glut.h>
    J'avais pas vu... tu as vraiment besoin de tout ça pour implémenter une classe singleton ? J'en serais étonné.

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par zais_ethael Voir le message
    Une instance statique dans une classe template qui soit générée automatiquement pour toute spécialisation déclarée dans le projet? C'est possible ça?
    Sinon, j'ai comme l'impression que tu as aussi déclaré les méthodes de ta classe Singleton dans un fichier .cpp...
    Oui, ca peut très bien marcher

    Pour rappel, le code exécutable d'une classe (ou d'une fonction) template est créé à chaque fois à la compilation, car le compilateur n'a aucune idée du type de données qu'il devra utiliser avant, et donc, les définitions de fonctions template (ou les définitions de variables statiques template) doivent apparaitre dans le fichier d'en-tete

    Tout ce que tu as mis dans global.cpp devrait donc etre "remonté" dans global.h, ou, à defaut, il te faudrait décider d'inclure global.cpp au lieu de global.h, ce qui n'est clairement pas recommandé, tant "les usages" font que l'on n'inclue jamais un .cpp

    Ceci dit, je ne suis personnellement pas tout à fait sur qu'il soit opportun de rajouter les inclusions de <windows.h>, <time.h>, <GL/glut.h>, <list>, <string>, <iostream>, et <fstream> dans ce fichier d'en-tete, tant tu crée des dépendances inutiles en le faisant (finalement, tous les fichiers dans lesquels tu va sans doute implémenter une instance de ton singleton n'auront surement pas tous besoin de l'ensemble de ces fichiers )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. un petit problème d'algo
    Par supertramp dans le forum Algorithmes et structures de données
    Réponses: 22
    Dernier message: 12/10/2004, 20h13
  2. Petit problème de décimales !
    Par ridan dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/09/2004, 21h24
  3. Réponses: 17
    Dernier message: 13/07/2004, 20h37
  4. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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