Singleton ... je suis perdu !!! [Résolu]

Signaler
Messages postés
10
Date d'inscription
mercredi 28 février 2007
Statut
Membre
Dernière intervention
1 juillet 2008
-
Messages postés
10
Date d'inscription
mercredi 28 février 2007
Statut
Membre
Dernière intervention
1 juillet 2008
-
Bonjour à tous,
j'ai un gros problème que j'essai de résoudre depuis trop de temps maintenant : je suis en train de développer un jeux (original ), et le moment fut venus de créer un classe pouvant faire le lien entre mes differents objet. Comme une instance de cette classe doit être unique et globale, j'ai cherché sur google "objet globale c++". Je suis alors tombé sus un site qui explicite la méthode du singleton qui me paraissai convenable. J'ai créé ma classe, pas d'erreur de compilation mais après ... trou noir. Quand j'essai de déclaré un objet comme dans cet example, tout va bien mais quand je veut l'utiliser dans un objet alors : 'scene01' was not declared in this scope !!!!! J'croyai qu'il était global.

Tout ça pour dire que je galère, si quelqun peut m'expliquer simplement comment faire (et sans templates car je ne connais pas encore cette méthode ) ce serai simpas.

8 réponses

Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
Jashnlt,

j'ai le sentiment qu'il y a deux ou trois choses qui t'ont échappé :

1 - s'il y a une classe qui n'est pas complète ici, C'EST LA TIENNE et ce malgré le paraphrasage d'internet. Il manque la principale méthode du pattern singleton qui est la méthode de classe Instance() qui permet de construire au besoin et de délivrer l'instance, et il manque également les constructeur/destructeur privés.

2 - lorsque tu auras correctement implémenté TOUT le pattern, tu NE DOIS PAS"faire que le pointeur de l'objet scene01 soit global", tu DOIS simplement utiliser partout dans le code la méthode de classe Instance() pour appeller ton objet. Mais, sais-tu seulement ce qu'est une méthode de classe ?

3 - EVIDEMMENT, il ne faut pas copier la déclaration des classes partout dans le code : il faut mettre la déclaration dans un header et utiliser l'inclusion du header dans les fichiers cpp qui dans lesquels l'objet est utilisé.

PS :  une méthode de classe est une méthode qui n'est pas associer aux objets d'une classe, mais à la classe elle-même. Les méthodes de classe sont déclarées statiques et s'utilisent principalement avec l'opérateur de résolution de portée ::, exemple :

#include "Scene.h"
void main()
{
    Scene::instance().do_something();
}

Mais assez paraphraser...
Messages postés
14889
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
3 décembre 2020
93
Salut,
As-tu bien inclus le fichier contenant la définition de ton singleton?

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Salut,

Singleton est un design pattern tout simple. Le bute et de permettre a une application de maintenir qu'une seule instance de classe et donc de la rendre accessible à la totalité du code.
Pour cela il te faut déclarer une variable static dans ta classe qui correspondra à l'instance unique à associer du meme type que ta classe.
Ensuite ton le main de ton progamme tu instancies un objet du meme type que ta classe singleton et le tour est joué.

Sinon je trouve que dans ton exemple, il complique un peu les choses.

Bon courage, et n'hésites pas à nous montrer ton bout de code si besoin.

Shell
Messages postés
10
Date d'inscription
mercredi 28 février 2007
Statut
Membre
Dernière intervention
1 juillet 2008

J'ai mis toute ma classe dans un header (Scene.h) et j'ai inclus cet header dans mon main.

DeAtHCrAsH, pourquoi il complique les choses

Voila la fin de ma classe :

class Scene
{
...
private:
    static Scene *_singleton;
    ...
};

Scene *Scene::_singleton = NULL;

Y-a-t'il un problème ?
Messages postés
10
Date d'inscription
mercredi 28 février 2007
Statut
Membre
Dernière intervention
1 juillet 2008

Bon, j'ai réussis à faire fonctionner mon singleton dans ma classe objet mais après pour faire que le pointeur de l'objet scene01 soit global, je bloque.
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
Le but du singleton n'est pas de fournir un "pointeur global" ; au contraire, le but est de faire en sorte que le pointeur de l'unique instance de ta classe soit gérée par la classe elle-même.

exemple d'implémentation :

class singleton
{
    private:
        singleton(){}
        virtual ~singleton(){}

    public:
        static singleton & instance()
        {
            static singleton instance;
            return intance;
        }

        void do_something()
        {
        }
};

utilisation :

singleton::instance().do_something();
Messages postés
10
Date d'inscription
mercredi 28 février 2007
Statut
Membre
Dernière intervention
1 juillet 2008

Lucky92, merci beaucoup de m'avoir répondu mais tu ne fais que paraphraser tout ce qu'il y a sur le Web et y compris ici.
Si tu avais bien lu ce que j'ai écrit en dernier, tu aurais su que j'avais compris que le but du singleton n'était pas de fournir un pointeur globale.

Maintenant, tout ce que tu me donne comme réponse est un code d'implémentation incomplet, dans le sens où, si je fais exactement ce que tu me dis, il risque d'y avoir des problème (recopier la classe dans chaque fichier ).

Merci encore pour ta réponse .
Messages postés
10
Date d'inscription
mercredi 28 février 2007
Statut
Membre
Dernière intervention
1 juillet 2008

J'ai accepter ta reponse pour le point n°3, j'ai trouvé hier que le problème était tout simplement là.
Je te remerci beaucoup pour tes réponses malgré le fait que "tu prend la mouche assé rapidement" : faut rester cool !

Merci encore