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

SL & STL C++ Discussion :

Probleme compilation map.find


Sujet :

SL & STL C++

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut Probleme compilation map.find
    Bonjour,

    J'ai un probleme de compilation sous VC.
    Voici le code :

    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
    // geometric_shape_factory.hpp
     
    #ifndef __GEOMETRIC_SHAPE_FACTORY_HPP__
    #define __GEOMETRIC_SHAPE_FACTORY_HPP__
     
    #include <map>
    #include <string>
     
    #include "geometric_shape.hpp"
     
    template <typename KEY , class OBJECT> class GeometricShapeFactory
    {
    public:
    	// un pointeur de fonction qui retourne un Object*
    	typedef OBJECT *(*Creator)(void);
    	// Le map qui stocke les associations entre la cle et le pointeur de fonction
    	std::map<KEY, Creator> _registeredCreator;
     
    	static bool Register(KEY key, Creator creator)
    	{
    		if( _registeredCreator.find(key) != _registeredCreator.end() )
    			return false; // la clef est deja utilisé
    		_registeredCreator.insert(std::pair<KEY, Creator>(key, creator) );
    			return true;
    	}
     
    	OBJECT * Create(KEY key)
    	{
    		OBJECT *object;
    		Creator creator;
    		std::map<KEY, Creator>::iterator it;
    		// On cherche le pointeur de fonction associé a la clef
    		it = _registeredCreator.find(key);
    		if( it == _registeredCreator.end() )
    			return NULL; // on ne l'a pas trouvé
    		// On récupère le pointeur de fonction
    		creator = (*it).second;
    		// On appelle la fonction pour créer un nouvel objet
    		object = (*creator)();
    		// On retourne l'objet
    		return object;
    	}
    };
     
    #endif
    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
    // square_shape.hpp
     
    #ifndef __SQUARE_SHAPE_HPP__
    #define __SQUARE_SHAPE_HPP__
     
    #include "geometric_shape.hpp"
    #include <vector>
    #include <iostream>
     
    /**
    @brief
    @author OTO
    @date
    **/
     
    class SquareShape : public GeometricShape
    {
    public:
    	/// \brief Création d'un objet SquareShape
    	static GeometricShape* create( void );
    	/// Set / Modification des paramètres d'un objet SquareShape
    	/// @param param Le vecteur contenant les paramètres de l'objet SquareShape
    	void SetParameters( const std::vector<double> & param );
    	/// Permet de connaître l'état du flag _is_registered
    	bool IsRegistered() {std::cout << "registered = " << _is_registered;return _is_registered;};
     
    private:
     
    	/// Flag indiquant si l'objet SquareShape est enregistré dans la <i>Factory</i> GeometricShapeFactory
    	static bool _is_registered;
    	double _size;
    };
     
    /**
    * @todo Finir l'implémentation de la classe ...
    **/
     
    #endif
    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
    // square_shape.cpp
     
    #include "../include/square_shape.hpp"
    #include "../include/geometric_shape_factory.hpp"
     
    #include <iostream>
    #include <string>
    #include <algorithm>
     
    GeometricShape * SquareShape::create(void)
    {
    	return new SquareShape();
    }
     
    void SquareShape::SetParameters( const std::vector<double> & param )
    {
    	;
    }
     
    bool SquareShape::_is_registered = GeometricShapeFactory<std::string,GeometricShape>::Register("SquareShape", SquareShape::create);
    Et j'ai les erreurs suivantes a la compilation (j'ai volontairement omis de mettre le code de la classe rectangle_shape qui est similaire a celui de la classe square_shape ...) :

    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
    Compilation...
    square_shape.cpp
    e:\Developpement\pimplib\pimplib_geometric_objects\src\../include\geometric_shape_factory.hpp(19) : error C2228: la partie gauche de '.find' doit avoir un type class/struct/union
            le type est ''
            e:\Developpement\pimplib\pimplib_geometric_objects\src\../include\geometric_shape_factory.hpp(18) : lors de la compilation de la fonction membre du modèle de classe 'bool GeometricShapeFactory<KEY,OBJECT>::Register(KEY,GeometricShapeFactory<KEY,OBJECT>::Creator)'
            with
            [
                KEY=std::string,
                OBJECT=GeometricShape
            ]
            src\square_shape.cpp(18) : voir la référence à l'instanciation du modèle de classe 'GeometricShapeFactory<KEY,OBJECT>' en cours de compilation
            with
            [
                KEY=std::string,
                OBJECT=GeometricShape
            ]
    e:\Developpement\pimplib\pimplib_geometric_objects\src\../include\geometric_shape_factory.hpp(19) : error C2228: la partie gauche de '.end' doit avoir un type class/struct/union
            le type est ''
    e:\Developpement\pimplib\pimplib_geometric_objects\src\../include\geometric_shape_factory.hpp(21) : error C2228: la partie gauche de '.insert' doit avoir un type class/struct/union
            le type est ''
    rectangle_shape.cpp
    e:\Developpement\pimplib\pimplib_geometric_objects\src\../include\geometric_shape_factory.hpp(19) : error C2228: la partie gauche de '.find' doit avoir un type class/struct/union
            le type est ''
            e:\Developpement\pimplib\pimplib_geometric_objects\src\../include\geometric_shape_factory.hpp(18) : lors de la compilation de la fonction membre du modèle de classe 'bool GeometricShapeFactory<KEY,OBJECT>::Register(KEY,GeometricShapeFactory<KEY,OBJECT>::Creator)'
            with
            [
                KEY=std::string,
                OBJECT=GeometricShape
            ]
            src\rectangle_shape.cpp(14) : voir la référence à l'instanciation du modèle de classe 'GeometricShapeFactory<KEY,OBJECT>' en cours de compilation
            with
            [
                KEY=std::string,
                OBJECT=GeometricShape
            ]
    e:\Developpement\pimplib\pimplib_geometric_objects\src\../include\geometric_shape_factory.hpp(19) : error C2228: la partie gauche de '.end' doit avoir un type class/struct/union
            le type est ''
    e:\Developpement\pimplib\pimplib_geometric_objects\src\../include\geometric_shape_factory.hpp(21) : error C2228: la partie gauche de '.insert' doit avoir un type class/struct/union
            le type est ''
    geometric_shape_factory.cpp
    Génération de code en cours...
     
    Temps de génération 0:01
    Le journal de génération a été enregistré à l'emplacement "file://e:\Developpement\pimplib\pimplib_geometric_objects\Release\BuildLog.htm"
    pimplib_geometric_objects - 6 erreur(s), 0 avertissement(s)
    Je ne comprends absolument pas pourquoi ... Une idee ?

    D'avance merci.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // un pointeur de fonction qui retourne un Object*
    	typedef OBJECT *(*Creator)(void);
    Ici Creator est un pointeur de fonction simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    GeometricShape * SquareShape::create(void)
    {
    	return new SquareShape();
    }
    //...
    bool SquareShape::_is_registered = GeometricShapeFactory<std::string,GeometricShape>::Register("SquareShape", SquareShape::create);
    Ici tu passes à ta fonction Register un pointeur sur fonction membre (la syntaxe est fausse au passage, cela devrait être &SquareShape::create) au lieu d'un pointeur sur fonction, comme elle l'attend.

    Deux solutions : soit tu définis ta fonction create hors de ta classe SquareShape, soit tu change le type de Creator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef OBJECT* (GeometricShape::*Creator)();

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut
    Deux solutions : soit tu définis ta fonction create hors de ta classe SquareShape, soit tu change le type de Creator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef OBJECT* (GeometricShape::*Creator)();
    J'ai opte pour la seconde solution, en changeant le type de Creator comme tu me l'as indique. Une autre erreur maintenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    square_shape.cpp
    \Developpement\pimplib\pimplib_geometric_objects\src\square_shape.cpp(18) : error C2664: 'GeometricShapeFactory<KEY,OBJECT>::Register' : impossible de convertir le paramètre 2 de 'GeometricShape *(__thiscall SquareShape::* )(void)' en 'GeometricShapeFactory<KEY,OBJECT>::Creator'
            with
            [
                KEY=std::string,
                OBJECT=GeometricShape
            ]
            and
            [
                KEY=std::string,
                OBJECT=GeometricShape
            ]
            Les types pointés n'ont aucun rapport entre eux ; conversion nécessitant reinterpret_cast, cast de style C ou cast de style fonction

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Je me suis planté dans mon post d'avant, j'avais pas fait gaffe que ta fonction create était static (mes excuses ), donc ta syntaxe du typedef était correcte, il manque juste le & devant SquareShape::create :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bool SquareShape::_is_registered = GeometricShapeFactory<std::string,GeometricShape>::Register("SquareShape", &SquareShape::create)

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut
    Citation Envoyé par bolhrak Voir le message
    Je me suis planté dans mon post d'avant, j'avais pas fait gaffe que ta fonction create était static (mes excuses ), donc ta syntaxe du typedef était correcte, il manque juste le & devant SquareShape::create :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bool SquareShape::_is_registered = GeometricShapeFactory<std::string,GeometricShape>::Register("SquareShape", &SquareShape::create)
    Ouais, ben ca veut toujours pas. Meme erreur que la precedente ...

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Ta fonction Register est static, elle essaye de modifier une variable de classe non statique (_registeredCreator).

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut
    Oui, tu as raison !
    J'ai donc mis mon map en static. Maintenant, ca compile, mais ca ne linke pas ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error LNK2019: symbole externe non résolu "public: static class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class GeometricShape * (__cdecl*)(void),struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class GeometricShape * (__cdecl*)(void)> > > GeometricShapeFactory<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class GeometricShape>::_registeredCreator" (?_registeredCreator@?$GeometricShapeFactory@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@VGeometricShape@@@@2V?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@P6APAVGeometricShape@@XZU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@P6APAVGeometricShape@@XZ@std@@@2@@std@@A) référencé dans la fonction "public: static bool __cdecl GeometricShapeFactory<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class GeometricShape>::Register(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class GeometricShape * (__cdecl*)(void))" (?Register@?$GeometricShapeFactory@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@VGeometricShape@@@@SA_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@P6APAVGeometricShape@@XZ@Z)
    Encore une fois, ca m'echappe. Surtout avec ces nomns decores ...
    Ca vient peut etre de ma classe mere GeometricShape, dans laquelle il n'y a rien ?

  8. #8
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Est-ce que tu as bien pensé à initialiser ta variable dans le cpp ? Comme indiqué ?

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut
    Merci.

    J'ai mis ca dans le cpp de GeometricShapeFactory :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <typename Key, class Object> std::map<Key, GeometricShapeFactory::Creator> GeometricShapeFactory<Key,Object>::_registeredCreator;
    Dans les cpp des ***Shape, j'ai mis ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool ***Shape::_is_registered = GeometricShapeFactory<std::string,GeometricShape>::Register("***Shape", ***Shape::Create );
    Toujours la meme erreur. Le premier bout de code est bon ?

  10. #10
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    La syntaxe est bonne pour tes ***Shapes ; pour ta factory, en fait vu qu'il s'agit d'une classe template il faut mettre la ligne de définition dans le .h, mais en dehors de la classe (faut que j'arrête de répondre aux messages après 1h, je loupe un détail à chaque fois ).

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut
    Meric. Effectivement, ca marche beaucoup mieux, surtout si on met les parametres du template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <typename Key, class Object> std::map<Key, typename GeometricShapeFactory<Key,Object>::Creator> GeometricShapeFactory<Key,Object>::_registeredCreator;
    Bon, maintenant, ca pete a l'execution. J'ai ca dans mon main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GeometricShapeFactory<std::string,GeometricShape> gsf;
    GeometricShape *rectangle = gsf.Create("Rectangle");
    Selon la pile des appels du debugger, c'est dans Register que ca ne va pas. J'ai mis un try catch, pas d'exception. Apparemment, ca vient du .find ...

  12. #12
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Je tablerai sur un problème d'ordre d'initialisation :

    http://cpp.developpez.com/faq/cpp/?p..._static_fiasco

    Esaye en mettant tous les membres de ta factory en non statiques, et en créant une méthode te permettant de récupérer ton objet factory, comme indiqué dans la FAQ.

    Tes variables register de chaque Shape devront alors passer par cette méthode pour s'enregistrer, ce qui garantit que la map de ta factory aura déjà été construite.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut
    Oui, merci, effectivement, il semble bien que cela provienne de la. Pour l'instant, je n'ai pas encore adopte la solution proposee dans le lien que tu m'as donne, mais je fais des appels a Register "a la main", et tout se passe bien.
    Je tente ce soir la mise en oeuvre pour eviter le fiasco et je passe le sujet en resolu des que j'ai valide.

    Encore merci.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut
    Me revoila ... Alors, j'ai mis en oeuvre le truc, et c'est presque parfait, a quelques "details" pres.

    Dans mon GeometricShapeFactory.hpp, j'ai rajoute ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <typename Key, class Object> GeometricShapeFactory<Key,Object>& GetGeometricShapeFactory()
    {
    	static GeometricShapeFactory<Key,Object>* factory = new GeometricShapeFactory<Key,Object>();
    	return *factory;
    }
    Et dans les cpp des classes des objets a construire, j'ai mis ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool SquareShape::_is_registered = GetGeometricShapeFactory<std::string,GeometricShape>().Register("Square", SquareShape::Create);
    Donc, la, ca marche, mes objets sont bien construits comme il faut. En revanche, je voudrais savoir si il est possible d'avoir ce genre de declaration la ou je veux effectivement utiliser ma factory :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GeometricShapeFactory<std::string,GeometricShape> gsf;
    au lieu de ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GeometricShapeFactory<std::string,GeometricShape> gsf = GetGeometricShapeFactory<std::string,GeometricShape>();
    Par ailleurs, je me rends compte que mon bool SquareShape::_is_registered vaut false :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    GeometricShapeFactory<std::string,GeometricShape> gsf = GetGeometricShapeFactory<std::string,GeometricShape>();
     
    	boost::shared_ptr< GeometricShape > square = gsf.Create("Square");
     
    	if ( sq != NULL )
    	{
    		sq->IsRegistered();
    	}
    affiche :

    Dans le fichier SquareShape.hpp, il y a ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool IsRegistered() {std::cout << "registered = " << _is_registered << std::endl;return _is_registered;};
    Comprends pas bien ...

  15. #15
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Citation Envoyé par olivier1978 Voir le message
    Donc, la, ca marche, mes objets sont bien construits comme il faut. En revanche, je voudrais savoir si il est possible d'avoir ce genre de declaration la ou je veux effectivement utiliser ma factory :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GeometricShapeFactory<std::string,GeometricShape> gsf;
    au lieu de ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GeometricShapeFactory<std::string,GeometricShape> gsf = GetGeometricShapeFactory<std::string,GeometricShape>();
    Non, tu ne peux pas, et la deuxième ligne ne fait pas non plus ce que tu veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GeometricShapeFactory<std::string,GeometricShape> gsf;
    construit un nouvel objet GeometricShapeFactory, ça ne récupère pas celui de ta méthode GetGeometricShapeFactory ; le fait d'avoir encapsuler la création de ton instance statique dans une méthode limite sa visibilité à cette méthode justement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GeometricShapeFactory<std::string,GeometricShape> gsf = GetGeometricShapeFactory<std::string,GeometricShape>();
    Là c'est un peu plus subtil. Tu récupères effectivement l'objet static déclaré dans la méthode GetGeometricShapeFactory, mais tu en fais une copie. Pour récupérer l'objet lui-même il faut que tu déclares une référence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GeometricShapeFactory<std::string,GeometricShape>& gsf = GetGeometricShapeFactory<std::string,GeometricShape>();
    Pour ton problème de isRegister, j'avoue ne pas très bien comprendre ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    GeometricShapeFactory<std::string,GeometricShape> gsf = GetGeometricShapeFactory<std::string,GeometricShape>();
     
    	boost::shared_ptr< GeometricShape > square = gsf.Create("Square");
     
    	if ( sq != NULL )
    	{
    		sq->IsRegistered();
    	}
    Je suppose que sq est en fait square ? Dans ce cas ton objet a bien été construit, donc le constructeur est enregistré, c'est juste qu'il doit y avoir une double initialisation de ta variable isRegister ou un truc du genre, qui le fait passer à False la deuxième fois sans pour autant virer le mapping String - méthode de création.

    En mettant un point d'arrêt sur la ligne bool isRegistered = .... ça devrais te donner plus d'info. Si j'ai mal compris le problème, il me faudrait un peu plus de code

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut
    Un grand merci a toi bohlrak. Tout fonctionne nickel maintenant ...
    En fait, pour l'histoire du _is_registered, j'avais fait une boulette : je l'initialisais a false dans le constructeur de la classe ... Je sais, c'est pas malin.
    Le topic a un peu derive, mais il est resolu ...

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

Discussions similaires

  1. Probleme a la compilation "cannot find symbol"
    Par nacrooks dans le forum Général Java
    Réponses: 4
    Dernier message: 20/01/2010, 15h16
  2. [DEBUTANT] problem compilation eclipse
    Par roninou dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 14/01/2005, 15h59
  3. [JAR]Probleme compilation avec jdom
    Par ronaldgis dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 04/08/2004, 11h31
  4. probleme compilation classe avec Borland c++ compiler 5.5
    Par softblue dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 17/06/2004, 15h16
  5. [Debian] problème compilation jbuilder 9...
    Par Ancien_Do.Urden dans le forum JBuilder
    Réponses: 5
    Dernier message: 20/03/2004, 15h02

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