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 :

factory, template, et enregistrement des objets


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 29
    Par défaut factory, template, et enregistrement des objets
    Bonjour,

    J'ai écrit une classe singleton de fabrique générique, j'utilise ensuite une classe de base pour l'enregistrement des objets, et je voulais que cet enregistrement se fasse par une macro appelant une fonction privée de la classe de base.

    Seulement, j'ai une erreur de compilation dans la fonction d'enregistrement dont je n'arrive pas à voir la cause.

    ObjectFactory.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
     
    template<typename T_ID, typename T_BASE>
    class ObjectFactory : public QSharedData
    {
        typedef T_BASE* (ClassCreationFunc) ();
        QHash<T_ID, ClassCreationFunc*> m_registry;
        static QAtomicPointer<ObjectFactory> m_instance;
        static QMutex m_mutex;
     
    public :
        template<typename T_OBJECT>
        static T_BASE* derivedClassCreationFunc()
        {
            T_OBJECT* t = new T_OBJECT;
            T_BASE* c = dynamic_cast<T_BASE*>(t);
            if (!c) delete t;
            return c;
        }
     
        static bool registerObject(T_ID id, ClassCreationFunc* func)
        {
            typename QHash<T_ID, ClassCreationFunc*>::iterator it =m_registry.insert(std::pair<T_ID, ClassCreationFunc*>(id, func));
            return(it != m_registry.end());
        }
     
        T_BASE* create(T_ID id)
        {
            T_BASE* obj = 0;
            typename QHash<T_ID, ClassCreationFunc*>::iterator it = m_registry.find(id);
            if (it != m_registry.end()) {
              ClassCreationFunc* pFunc = it->second;
              obj = pFunc();
            }
            return obj;
        }
     
        static QSharedDataPointer<ObjectFactory> getInstance()
        {
            if(!m_instance) {
                QMutexLocker locker(&m_mutex);
                if(!m_instance) {
     
                }
            }
            return m_instance;
        }
     
    #endif // OBJECTFACTORY_H
    AbstractObject.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class AbstractObject
    {
    private :
        template<typename T_ID,typename T_OBJECT>
        bool _register_object(T_ID id);
    public:
        AbstractObject();
        virtual ~AbstractObject();
     
    #define REGISTER_OBJECT(T_ID,id,T_OBJECT) bool _FACTORY_REGISTERED_ = _register_object<T_ID,T_OBJECT>(id);
    };
    Le code qui pose problème, AbstractObject.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template<typename T_ID, typename T_OBJECT>
    bool AbstractObject::_register_object(T_ID id)
    {
        ObjectFactory<T_ID,AbstractObject> fac = ObjectFactory<T_ID,AbstractObject>::getInstance();
     
    // la ligne qui provoque l'erreur :    
        return fac.registerObject(id, ObjectFactory<T_ID, AbstractObject>::derivedClassCreationFunc<T_OBJECT>);
    }
    Et le message du compilateur :
    abstractobject.cpp: error: expected primary-expression before '>' token
    J'ai retourné le problème dans tous les sens, et je n'arrive pas à voir d'où viens cette erreur.

    Si quelqu'un pouvait m'aiguiller, je lui en serais reconnaissant

    Merci par avance.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    le code template ne doit pas se trouver dans un .cpp.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 29
    Par défaut
    Merci pour cette réponse, mais cela ne change rien.

    D'ailleurs, à la base, ce code était dans le .h, je l'ai bougé pour faire d'autres essais qui ne se sont pas révélés concluant.

  4. #4
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    C'est peut-être juste une erreur de copier/coller, mais il manque une accolade fermante a la déclaration de ObjectFactory.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 29
    Par défaut
    Effectivement, c'est une erreur de copier-coller

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Ensuite, je trouve ton singleton un peu étrange puisqu'il retourne une copie.
    En général un singleton retourne une référence, ou un pointeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static MySingleton& getInstance();
    Pour les membres static, on préfèrera le préfixe s_, laissant le m_ aux membres à part entière.

    Le code mis dans le .h déclenche la même erreur ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Enregistrer des objets en XML : Sérialisation JavaBeans
    Par julien_chable dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 08/03/2011, 18h53
  2. Enregistrement des objets dans la RAM
    Par asma07 dans le forum C#
    Réponses: 7
    Dernier message: 18/10/2010, 17h23
  3. Réponses: 3
    Dernier message: 31/03/2008, 15h13
  4. Réponses: 3
    Dernier message: 12/09/2007, 10h53
  5. Réponses: 2
    Dernier message: 08/12/2006, 01h20

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