 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
read_in Guest
|
Posted: Wed Jul 30, 2003 5:34 pm Post subject: Re: Construction etrange: static int* id = new int(0); |
|
|
Le Wed, 30 Jul 2003 16:56:15 +0200, Christophe Lephay a écrit :
| Quote: |
C'est une erreur de programmation, bien entendu. Si l'allocation dynamique
permet bien de créer un nouveau compteur à chaque appel, on peut se
demander, en revanche, à quoi sert le static. En plus, c'est souvent un
|
le static ne sert pas a garder la valeur du compteur à chaque fois qu'on
appelle la fonction ? de sorte que l'allocation ne se ferait qu'une fois,
et que la fonction ne serve qu'a renvoyer un entier unique (avec une
allocation/initialisation lors du premier appel uniquement)
non ?
|
|
| Back to top |
|
 |
Arnaud Debaene Guest
|
Posted: Wed Jul 30, 2003 6:47 pm Post subject: Re: Construction etrange: static int* id = new int(0); |
|
|
read_in wrote:
| Quote: | Le Wed, 30 Jul 2003 16:56:15 +0200, Christophe Lephay a écrit :
C'est une erreur de programmation, bien entendu. Si l'allocation
dynamique permet bien de créer un nouveau compteur à chaque appel,
on peut se demander, en revanche, à quoi sert le static. En plus,
c'est souvent un
le static ne sert pas a garder la valeur du compteur à chaque fois
qu'on appelle la fonction ? de sorte que l'allocation ne se ferait
qu'une fois, et que la fonction ne serve qu'a renvoyer un entier
unique (avec une allocation/initialisation lors du premier appel
uniquement)
non ?
|
Oui, mais quel intérêt d'allouer ce compteur statique sur le tas? Pourquoi
pas un simple int ?
Arnaud
|
|
| Back to top |
|
 |
Arnaud Debaene Guest
|
Posted: Wed Jul 30, 2003 6:48 pm Post subject: Re: Construction etrange: static int* id = new int(0); |
|
|
Marc Boyer wrote:
<snip>
| Quote: | static int* idCount = new int(0);
snip |
C'est censé faire quoi déjà l'allocation d'n tableau de taille 0? Ce n'est
pas un pointeur effectivement valide mais qu'on ne peut pas déréférencer?
Arnaud
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
|
| Back to top |
|
 |
Arnaud Debaene Guest
|
Posted: Thu Jul 31, 2003 7:31 am Post subject: Re: Construction etrange: static int* id = new int(0); |
|
|
"Arnaud Debaene" <adebaene (AT) club-internet (DOT) fr> wrote
| Quote: | Marc Boyer wrote:
snip
static int* idCount = new int(0);
snip
C'est censé faire quoi déjà l'allocation d'n tableau de taille 0? Ce n'est
pas un pointeur effectivement valide mais qu'on ne peut pas déréférencer?
|
Argh! Oubliez ce que j'ai dit, j'avais lu new int [0] :-(
Arnaud
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Thu Jul 31, 2003 9:32 am Post subject: Re: Construction etrange: static int* id = new int(0); |
|
|
"Christophe Lephay" <christophe-lephay (AT) wanadoo (DOT) fr> wrote
| Quote: | "Marc Boyer" <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr> a écrit dans le message de
news:bg81go$7es$2 (AT) news (DOT) cict.fr...
Je tente de reprende un code dont l'auteur est injoignable.
Dans une classe qui sert à enregistrer des objet et à leur donner
un ID unique (entier) je suis tombé sur un code étrange:
int& IdManager::itsIdCount() {
static int* idCount = new int(0);
(*idCount)++;
return *idCount;
};
Cette méthode est statique et privée. Elle n'est utilisée
qu'une seule fois dans le code d'une autre méthode (publique)
int i = itsIdCount();
Quel intérêt de passer par un pointeur ?
|
Aucun que je peux voir. Je suppose cependant que le programmeur a bien
commenté pourquoi il l'a fait. (Sinon, je comprends pourquoi il a voulu
se rendre injoignable.)
| Quote: | C'est une erreur de prog ou c'est un idiome dont la subtilité m'a
échappée ?
C'est une erreur de programmation, bien entendu.
|
Ce n'est pas une *erreur*. C'est probablement que le programmeur initial
a copié trop directement du code de l'idiome Singleton, tel qu'il est
présenté dans « Design Patterns », sans trop reflechir s'il convenait
vraiment (et sans se tenir au jour des évolutions de l'idiome). Encore
qu'il aurait pu faire pire :
static int* idCount = NULL ;
if ( idCount == NULL ) {
idCount = new int( 0 ) ;
}
// ...
C'est la forme dans le livre, je crois.
| Quote: | Si l'allocation dynamique permet bien de créer un nouveau compteur à
chaque appel, on peut se demander, en revanche, à quoi sert le
static.
|
Justement, le static sert à ce que le compteur ne soit créé qu'une seule
fois.
| Quote: | En plus, c'est souvent un mauvais style que d'attribuer la
responsabilité de la désallocation à l'appelent alors que c'est
l'appelé qui fait l'allocation.
|
Peut-être, mais qu'est-ce que ça a à voir avec le code en question ? Le
client ne voit jamais le pointeur.
| Quote: | Qui plus est, pourquoi s'embêter avec des pointeurs alors que la
sémantique de valeur de int est si évidente ?
|
C'est en effet la grande question. Je soupçonne un calcage trop direct
du modèle singleton, tel qu'il est présenté dans « Design Patterns ».
En soi, ce n'est pas un problème -- le code fonctionne. Mais chaque fois
qu'on fait quelque chose, il faut bien documenter pourquoi. Si l'auteur
avait écrit qu'il faisait un Singleton, avec référence au livre, Marc
n'aurait sûrement pas eu besoin de nous poser la question. (Et je ne
jetterais pas la pierre à l'auteur, s'il l'avait documenté. Des calcages
trop directs, ça arrive facilement quand on doit travailler vite et sous
pression, et qu'on veut bien faire en se basant sur l'existant.)
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Thu Jul 31, 2003 9:49 am Post subject: Re: Construction etrange: static int* id = new int(0); |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote:
| Quote: | "Christophe Lephay" <christophe-lephay (AT) wanadoo (DOT) fr> wrote in message
news:<bg8mac$nv$1 (AT) news-reader5 (DOT) wanadoo.fr>...
"Marc Boyer" <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr> a écrit dans le message de
news:bg81go$7es$2 (AT) news (DOT) cict.fr...
Je tente de reprende un code dont l'auteur est injoignable.
C'est une erreur de prog ou c'est un idiome dont la subtilité m'a
échappée ?
C'est une erreur de programmation, bien entendu.
Ce n'est pas une *erreur*. C'est probablement que le programmeur initial
a copié trop directement du code de l'idiome Singleton, tel qu'il est
présenté dans « Design Patterns », sans trop reflechir s'il convenait
vraiment (et sans se tenir au jour des évolutions de l'idiome). Encore
qu'il aurait pu faire pire :
static int* idCount = NULL ;
if ( idCount == NULL ) {
idCount = new int( 0 ) ;
}
// ...
C'est la forme dans le livre, je crois.
|
Ca me semble l'explication la plus rationnelle oui.
Je soupsonnais bien un rapport avec le singleton, mais
je me demandais si c'en était une version particulière
dont la subtilité m'avait échappé.
Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(
|
|
| Back to top |
|
 |
Christophe Lephay Guest
|
Posted: Thu Jul 31, 2003 11:14 am Post subject: Re: Construction etrange: static int* id = new int(0); |
|
|
"Arnaud Debaene" <adebaene (AT) club-internet (DOT) fr> a écrit dans le message de
news:16a4a8c7.0307302331.4fc91183 (AT) posting (DOT) google.com...
| Quote: | "Arnaud Debaene" <adebaene (AT) club-internet (DOT) fr> wrote
Marc Boyer wrote:
snip
static int* idCount = new int(0);
snip
C'est censé faire quoi déjà l'allocation d'n tableau de taille 0? Ce
n'est
pas un pointeur effectivement valide mais qu'on ne peut pas
déréférencer?
Argh! Oubliez ce que j'ai dit, j'avais lu new int [0]
|
J'ai moi aussi mal compris le code après la première lecture que j'en ai
faite. Mes lectures sont toujours un peu rapides sur les ng, et je me laisse
ainsi facilement obfusquer ;)
Chris
|
|
| Back to top |
|
 |
Christophe Lephay Guest
|
Posted: Thu Jul 31, 2003 11:20 am Post subject: Re: Construction etrange: static int* id = new int(0); |
|
|
<kanze (AT) gabi-soft (DOT) fr> a écrit dans le message de
news:d6652001.0307310132.29974c2b (AT) posting (DOT) google.com...
| Quote: | "Christophe Lephay" <christophe-lephay (AT) wanadoo (DOT) fr> wrote in message
news:<bg8mac$nv$1 (AT) news-reader5 (DOT) wanadoo.fr>...
int& IdManager::itsIdCount() {
static int* idCount = new int(0);
(*idCount)++;
return *idCount;
};
Cette méthode est statique et privée. Elle n'est utilisée
qu'une seule fois dans le code d'une autre méthode (publique)
int i = itsIdCount();
Quel intérêt de passer par un pointeur ?
Aucun que je peux voir. Je suppose cependant que le programmeur a bien
commenté pourquoi il l'a fait. (Sinon, je comprends pourquoi il a voulu
se rendre injoignable.)
C'est une erreur de prog ou c'est un idiome dont la subtilité m'a
échappée ?
C'est une erreur de programmation, bien entendu.
Ce n'est pas une *erreur*.
|
C'est vrai que ça marche...
| Quote: | Si l'allocation dynamique permet bien de créer un nouveau compteur à
chaque appel, on peut se demander, en revanche, à quoi sert le
static.
Justement, le static sert à ce que le compteur ne soit créé qu'une seule
fois.
|
Oui, j'avais mal compris le code à la première lecture...
| Quote: | Qui plus est, pourquoi s'embêter avec des pointeurs alors que la
sémantique de valeur de int est si évidente ?
C'est en effet la grande question. Je soupçonne un calcage trop direct
du modèle singleton, tel qu'il est présenté dans « Design Patterns ».
|
Quelque chose qui me parait tout aussi étrange, c'est le fait de renvoyer
une référence à un int. Celà évoque-t-il aussi les Design Patterns ?
Chris
|
|
| 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
|
|