Singleton ... je suis perdu !!!

Résolu
jashnlt Messages postés 10 Date d'inscription mercredi 28 février 2007 Statut Membre Dernière intervention 1 juillet 2008 - 30 juin 2008 à 10:35
jashnlt Messages postés 10 Date d'inscription mercredi 28 février 2007 Statut Membre Dernière intervention 1 juillet 2008 - 1 juil. 2008 à 12:54
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

cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
1 juil. 2008 à 07:53
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...
3
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
30 juin 2008 à 10:56
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
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
30 juin 2008 à 10:58
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
0
jashnlt Messages postés 10 Date d'inscription mercredi 28 février 2007 Statut Membre Dernière intervention 1 juillet 2008
30 juin 2008 à 15:41
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jashnlt Messages postés 10 Date d'inscription mercredi 28 février 2007 Statut Membre Dernière intervention 1 juillet 2008
30 juin 2008 à 16:56
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.
0
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
30 juin 2008 à 18:41
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();
0
jashnlt Messages postés 10 Date d'inscription mercredi 28 février 2007 Statut Membre Dernière intervention 1 juillet 2008
30 juin 2008 à 19:07
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 .
0
jashnlt Messages postés 10 Date d'inscription mercredi 28 février 2007 Statut Membre Dernière intervention 1 juillet 2008
1 juil. 2008 à 12:54
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
0
Rejoignez-nous