Probléme variable static et classe incompréhension
cs_Booster
Messages postés235Date d'inscriptionmercredi 30 octobre 2002StatutMembreDernière intervention 6 octobre 2009
-
15 janv. 2008 à 10:23
PetersonG
Messages postés7Date d'inscriptionlundi 19 mars 2007StatutMembreDernière intervention18 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
cs_mastoc
Messages postés26Date d'inscriptionmardi 22 février 2005StatutMembreDerniè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.
cs_Booster
Messages postés235Date d'inscriptionmercredi 30 octobre 2002StatutMembreDerniè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 !
PetersonG
Messages postés7Date d'inscriptionlundi 19 mars 2007StatutMembreDernière intervention18 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.
cs_mastoc
Messages postés26Date d'inscriptionmardi 22 février 2005StatutMembreDerniè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 ;)
PetersonG
Messages postés7Date d'inscriptionlundi 19 mars 2007StatutMembreDernière intervention18 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)