 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Pascal Pizeine Guest
|
Posted: Wed Jan 05, 2005 10:28 am Post subject: variable de méthode static |
|
|
Bonjour,
J'ai un doute sur le fonctionnement des variables static et je n'arrive pas
à trouver une doc qui m'explique ça.(si quelqu'un à un lien ca m'intéresse)
J'ai le code suivant
class A {
public:
void f();
}
void A::f()
{
static bool bFirst = true;
// traitements
}
Est ce que j'ai une variable bFirst pour chacun de mes objets de classe A ou
bien n'y a t'il qu'une seule variable bFirst pour tous les objets.
Pascal
|
|
| Back to top |
|
 |
fabrizio Guest
|
Posted: Wed Jan 05, 2005 10:51 am Post subject: Re: variable de méthode static |
|
|
| Quote: | class A {
public:
void f();
}
void A::f()
{
static bool bFirst = true;
// traitements
}
Est ce que j'ai une variable bFirst pour chacun de mes objets de classe A ou
bien n'y a t'il qu'une seule variable bFirst pour tous les objets.
|
à mon humble avis, une variable par instance de cette classe.
persistante d'un appel à l'autre de la fonction et allouer dans la zone
statique.
|
|
| Back to top |
|
 |
Pierre Lairez Guest
|
Posted: Wed Jan 05, 2005 12:07 pm Post subject: Re: variable de méthode static |
|
|
Personnellement, j'aurais dit pareil, mais l'expérience montre que non. Et
c'est finalement assez logique: une fonction membre n'a pas besoin d'avoir
de variable statique, les variables membre sont là pour ça.
#include <iostream>
struct foo
{
void f();
};
void foo::f ()
{
static int i = 1;
std::cout << (i++) << std::endl;
return;
}
int main()
{
foo a, b;
a.f();
a.f();
b.f();
}
Ce code donne bien 1, 2 puis 3.
Le Wed, 05 Jan 2005 11:51:55 +0100, fabrizio
| Quote: | class A {
public:
void f();
}
void A::f()
{
static bool bFirst = true;
// traitements
}
Est ce que j'ai une variable bFirst pour chacun de mes objets de
classe A ou
bien n'y a t'il qu'une seule variable bFirst pour tous les objets.
à mon humble avis, une variable par instance de cette classe.
persistante d'un appel à l'autre de la fonction et allouer dans la zone
statique.
|
|
|
| Back to top |
|
 |
Julien Lamy Guest
|
Posted: Wed Jan 05, 2005 12:22 pm Post subject: Re: variable de m������������� |
|
|
Pascal Pizeine wrote:
| Quote: | Bonjour,
J'ai un doute sur le fonctionnement des variables static et je n'arrive pas
� trouver une doc qui m'explique �a.(si quelqu'un � un lien ca m'int�resse)
J'ai le code suivant
class A {
public:
void f();
}
void A::f()
{
static bool bFirst = true;
// traitements
}
Est ce que j'ai une variable bFirst pour chacun de mes objets de classe A ou
bien n'y a t'il qu'une seule variable bFirst pour tous les objets.
|
Une seule variable pour tous les objets, cf. par exemple "Le langage
C++", paragraphe 7.1.2
Si tu en veux une par objet qui conserve sa valeur d'un appel de A::f Ã
l'autre, il te faut une variable membre.
--
Julien
|
|
| Back to top |
|
 |
Pascal Pizeine Guest
|
Posted: Wed Jan 05, 2005 12:28 pm Post subject: Re: variable de méthode static |
|
|
Merci pour ta réponse
Pour ce qui est de mon besoin, je souhaitait utiliser cette variable
statique pour différencier le premier appel de ma méthode pour chacun de mes
objets. Je trouve qu'avec une variable membre c'est moins propre car elle
peut être modifiée par d'autres méthodes.
Pascal
"Pierre Lairez" <pierre.lairez (AT) wanadoo (DOT) fr> a écrit dans le message de
news:opsj4pa5dru5stbh (AT) gorille (DOT) ..
| Quote: |
Personnellement, j'aurais dit pareil, mais l'expérience montre que non. Et
c'est finalement assez logique: une fonction membre n'a pas besoin d'avoir
de variable statique, les variables membre sont là pour ça.
#include <iostream
struct foo
{
void f();
};
void foo::f ()
{
static int i = 1;
std::cout << (i++) << std::endl;
return;
}
int main()
{
foo a, b;
a.f();
a.f();
b.f();
}
Ce code donne bien 1, 2 puis 3.
Le Wed, 05 Jan 2005 11:51:55 +0100, fabrizio
class A {
public:
void f();
}
void A::f()
{
static bool bFirst = true;
// traitements
}
Est ce que j'ai une variable bFirst pour chacun de mes objets de
classe A ou
bien n'y a t'il qu'une seule variable bFirst pour tous les objets.
à mon humble avis, une variable par instance de cette classe.
persistante d'un appel à l'autre de la fonction et allouer dans la zone
statique.
|
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Wed Jan 05, 2005 1:19 pm Post subject: Re: variable de méthode static |
|
|
On Wed, 5 Jan 2005 13:28:43 +0100, "Pascal Pizeine"
<pascal.pizeine (AT) milesys (DOT) fr>:
| Quote: | Pour ce qui est de mon besoin, je souhaitait utiliser cette variable
statique pour différencier le premier appel de ma méthode
|
Avertissement habituel sur le mot méthode en C++.
| Quote: | pour chacun de mes
objets. Je trouve qu'avec une variable membre c'est moins propre car elle
peut être modifiée par d'autres méthodes.
|
Une méthode possible est de remplacer ta fonction par une sous-classe,
qui contient la variable "bFirst" est les fonctions qui tournent
autour.
Une autre méthode, que je n'ai jamais utilisée mais qui pourrait
fonctionner :
void A::f()
{
static std::map <A*, bool> map_not_first;
if (map_not_first[this] == false)
{
// Premier appel
map_not_first[this]= true;
}
else
{
// appels suivants
}
}
L'idée est de profiter du fait que les éléments d'un std::map<> sont
initialisés par le constructeur par défaut (ce qui revient à la valeur
"zéro" pour les types de base) lors du premier appel de operator[].
--
;-)
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Wed Jan 05, 2005 3:25 pm Post subject: Re: variable de méthode static |
|
|
On Wed, 05 Jan 2005 13:07:43 +0100, "Pierre Lairez"
<pierre.lairez (AT) wanadoo (DOT) fr>:
| Quote: | c'est finalement assez logique: une fonction membre n'a pas besoin d'avoir
de variable statique, les variables membre sont là pour ça.
|
C'est surtout qu'une fonction membre est une fonction normale, à ceci
près qu'elle a un paramètre caché. Du coup,
void A::f()
{
static bool bFirst = true;
...
}
revient à peu près à
void A__f (A* this)
{
static bool bFirst = true;
...
}
--
;-)
|
|
| Back to top |
|
 |
Nil Guest
|
Posted: Wed Jan 05, 2005 4:06 pm Post subject: Re: variable de méthode static |
|
|
"Pierre Lairez" <pierre.lairez (AT) wanadoo (DOT) fr> a écrit dans le message de news:
opsj4pa5dru5stbh (AT) gorille (DOT) ..
| Quote: |
Personnellement, j'aurais dit pareil, mais l'expérience montre que non. Et
c'est finalement assez logique: une fonction membre n'a pas besoin d'avoir
de variable statique, les variables membre sont là pour ça.
#include <iostream
struct foo
{
void f();
};
void foo::f ()
{
static int i = 1;
std::cout << (i++) << std::endl;
return;
}
int main()
{
foo a, b;
a.f();
a.f();
b.f();
}
Ce code donne bien 1, 2 puis 3.
Le Wed, 05 Jan 2005 11:51:55 +0100, fabrizio
class A {
public:
void f();
}
void A::f()
{
static bool bFirst = true;
// traitements
}
Est ce que j'ai une variable bFirst pour chacun de mes objets de
classe A ou
bien n'y a t'il qu'une seule variable bFirst pour tous les objets.
à mon humble avis, une variable par instance de cette classe.
persistante d'un appel à l'autre de la fonction et allouer dans la zone
statique.
|
Je crois qu'un raisonnement permet de voir qu'effectivement chaque instance
de A ne peut pas posséder sa propre instance de bFirst.
En effet, il me semble que les objets dont la classe d'allocation mémoire
est statique doivent être connus à la compilation. Or, le nombre d'instances
de A crées à l'exécution ne peut pas (sauf cas simples) être déterminé à la
compilation, donc chaque instance de A ne peut pas posséder sa propre
instance de bFirst.
Mais peut-être pourrait-on imaginer qu'un compilateur facétieux divise (à
son goût.) les instances de A en deux groupes qui verraient chacun sa propre
instance de bFirst. Mais je n'y crois pas beaucoup. ;-)
--
Nil
|
|
| Back to top |
|
 |
Alain Naigeon Guest
|
Posted: Wed Jan 05, 2005 5:27 pm Post subject: Re: variable de méthode static |
|
|
bFirst est une variable déclarée static dans une fonction membre,
ce n'est pas la même chose qu'une variable membre static.
Jusqu'ici dans le fil j'ai eu l'impression que cette distinction n'a
pas été clairement faite ?!
--
Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - [email]anaigeon (AT) free (DOT) fr[/email] - Strasbourg, France
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Wed Jan 05, 2005 8:32 pm Post subject: Re: variable de méthode static |
|
|
"Alain Naigeon" <anaigeon (AT) free (DOT) fr> writes:
| Quote: | bFirst est une variable déclarée static dans une fonction membre,
ce n'est pas la même chose qu'une variable membre static.
Jusqu'ici dans le fil j'ai eu l'impression que cette distinction n'a
pas été clairement faite ?!
|
En effet, il semble y avoir un peu de confusion. J'ai vu plusieurs
fois parler d'objets ou de classes, alors que cela n'a de rapport
qu'avec la fonction elle-même (qui elle-même « n'existe qu'en un seul
exemplaire »).
--drkm
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Wed Jan 05, 2005 10:18 pm Post subject: Re: variable de méthode static |
|
|
On Wed, 5 Jan 2005 18:27:59 +0100, "Alain Naigeon" <anaigeon (AT) free (DOT) fr>:
| Quote: | bFirst est une variable déclarée static dans une fonction membre,
|
Je dirais même plus : bFirst est une variable déclarée static dans une
fonction. Cette fonction se trouve être membre d'une classe, mais
c'est un autre sujet.
--
;-)
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|