Probléme variable static et classe incompréhension

cs_Booster Messages postés 235 Date d'inscription mercredi 30 octobre 2002 Statut Membre Dernière intervention 6 octobre 2009 - 15 janv. 2008 à 10:23
PetersonG Messages postés 7 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 18 janvier 2008 - 15 janv. 2008 à 13:24
Bonjour,

Voilà, j'ai une incompréhension au niveau d'une variable static. Voici mon code :

maclasse.h

class maclasse; //Ca me sert juste à ce que ma variable static trouve ma classe
static maclasse C;

class maclasse{
    public:
           maclasse(); //Constructeur
           ~maclasse(); //Destructeur
}

maclasse.cpp

maclasse:maclasse(){ //Constructeur
    C=this;
}

maclasse:~maclasse(){ //Destructeur

    C=NULL;

}

La question est : pouquoi lorsque je suis dans mon constructeur ou destructeur ma variable static vaux bien ce que je veux, et lorsque je sort de mon constructeur/destructeur la variable static reprend la valeur quelle avait avant d'entrer dans le constructeur/destructeur ?

Je ne vois pas pourquoi et je ne vois pas non plus comment faire pour que cela marche :D

Merci d'avance de vos réponses.

8 réponses

cs_mastoc Messages postés 26 Date d'inscription mardi 22 février 2005 Statut Membre Dernière intervention 3 mars 2009
15 janv. 2008 à 12:05
Juste une question : ta variable doit vraiment être statique ?

Une autre question : à quoi te sert cette variable ? Pourquoi mettre une instance de ta classe dans une variable statique ?
Cette variable va donc contenir un instance de ta classe. Mais lorsque tu appels ton constructeur tu as déjà créé une instance ?!
Bref, as tu plus d'explication sur ce que tu veux faire ?

sinon essaye toujours avec une variable membre non static.

Vive les Moutons !
0
cs_Booster Messages postés 235 Date d'inscription mercredi 30 octobre 2002 Statut Membre Dernière intervention 6 octobre 2009
15 janv. 2008 à 12:22
Salut,


Et merci pour ta réponse.


1) Oui elle doit être statique sinon j'ai des problèmes ^^


2) Cette variable me sert en quelque sorte à faire un singleton de ma classe (java) j'utilise cette variable dans ma classe pour savoir si cette dernière est instancié.


Donc je viens de faire d'autre tests car tu m'as donné des idées et je viens de m'apercevoir en réalité que ma variable est instanciée 2 fois en quelque sorte.


Donc la question c'est pourquoi ?


Pourquoi ma variable à l'intérieur de ma classe vaux quelque chose.


Et à l'extérieur de ma classe cette même variable vaux autre chose !









Merci d'avance ;)
0
PetersonG Messages postés 7 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 18 janvier 2008
15 janv. 2008 à 12:33
Tu utilises la passe jedi "class maclasse;" qui dit au compilo de te faire confiance sur la nature de cette classe là.

Dans ton constructeur, this est de type maclasse* alors que C est de type maclasse qui n'est pas un pointeur ! Je pense que ça compile juste parce que variable C de type non définit et devrait être non initialisée.


Je pense que pour d'obscures raisons la variable C dans ton constructeur est une variable locale qui n'a rien à voir avec ta variable statique (et peut-être de type int si tu ne travailles pas sous un MSVC assez récent).


Essaies déjà de déclarer ta variable C en type maclass* et de
l'initialiser dans le cpp, tu devrais mieux voir ce qui se passe ^^

Sinon, pour faire un singleton, ta variable doit être une statique de ta classe maclasse, et ton constructeur doit être private.

class maclasse{
    private:

       maclasse(); //Constructeur
       static maclasse*   m_instance;
    public:
        static maclasse*   getInstance()
        {
             if(!m_instance)
                 m_instance = new maclasse();
             return m_instance;
         }
}

maclasse::m_instance=NULL;


Peterson
0
cs_mastoc Messages postés 26 Date d'inscription mardi 22 février 2005 Statut Membre Dernière intervention 3 mars 2009
15 janv. 2008 à 12:33
J'ai déjà eu le même problème il me semble mais je ne me souviens plus exactement de la raison...

Pour les singletons j'ai trouvé ça ca peut t'intéresser :
http://tfc.duke.free.fr/coding/singleton.html

Vive les Moutons !
0

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

Posez votre question
cs_mastoc Messages postés 26 Date d'inscription mardi 22 février 2005 Statut Membre Dernière intervention 3 mars 2009
15 janv. 2008 à 12:36
Ben en fait j'avais pas lu le post de Peterson. Je suis d'accord avec lui. Passe ta variable static en pointeur et c'est bon. sinon utilise la méthode que je t'ai envoyé elle devrait marcher ;)

Vive les Moutons !
0
cs_Booster Messages postés 235 Date d'inscription mercredi 30 octobre 2002 Statut Membre Dernière intervention 6 octobre 2009
15 janv. 2008 à 12:38
Salut,

Escuse erreur de ma part c'est bien un pointeur (je rectifie)

static maclasse * C;

class maclasse{
    public:
           maclasse(); //Constructeur
           ~maclasse(); //Destructeur
}

maclasse.cpp

maclasse:maclasse(){ //Constructeur
    C=this;
}

maclasse:~maclasse(){ //Destructeur
    C=NULL;
}

J'ai bien mi ça !

Merci
0
PetersonG Messages postés 7 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 18 janvier 2008
15 janv. 2008 à 13:22
Ben ton pointeur static n'est pas initialisé, ce qui explique que ça
compile : ce n'est qu'un pointeur, donc une adresse non initialisée
sans espace mémoire associé. Tu pourrais lui dire :


class Banane; //Ca me sert juste à ce que ma variable static trouve ma classe
static Banane* C;


que ça aurait le même effet.


De plus, je ne vois pas de raison que cette variabe C soit
accessible dans ta classe, donc ton constructeur doit en redéclarer
une. Il me semble que certains compilateurs acceptent la déclaration de
variables sans indication de type (du coup, ça doit être un int), mais
ce n'est pas le cas de tous et il y a de fortes chances que ça te
balance au moins un warning.
Ta variable pourrait peut-être être accédée par ton constructeur si elle était en global (? j'avoue que j'ai un doute vu que je n'utilise les global qu'un fois tous les 5 ans…) mais ça serait vraiment SALE !!


Enfin, le but du design Singleton, c'est quand même que tu n'ais qu'une
instance de ta classe dans tout le programme. Pour ça, il faut que tu
interdises l'accès au constructeur par l'utilisateur de la classe, ce
qui est accomplit en déclarant le constructeur en private.

En bref, tu ferais mieux de suivre le Pattern ^^
(wikipedia peut être ton ami, pour ça)


++

Peterson
0
PetersonG Messages postés 7 Date d'inscription lundi 19 mars 2007 Statut Membre Dernière intervention 18 janvier 2008
15 janv. 2008 à 13:24
Oups erreur :
*…ce qui est accomplit en déclarant le constructeur en private ou en protected.

parce que sinon, si tu dérives ta classe, ça pourrait etre problématique.
0
Rejoignez-nous