C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Re: Construction etrange: static int* id = new int(0);

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
read_in
Guest





PostPosted: Wed Jul 30, 2003 5:34 pm    Post subject: Re: Construction etrange: static int* id = new int(0); Reply with quote



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





PostPosted: Wed Jul 30, 2003 6:47 pm    Post subject: Re: Construction etrange: static int* id = new int(0); Reply with quote



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





PostPosted: Wed Jul 30, 2003 6:48 pm    Post subject: Re: Construction etrange: static int* id = new int(0); Reply with quote



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





PostPosted: Thu Jul 31, 2003 3:33 am    Post subject: Re: Construction etrange: static int* id = new int(0); Reply with quote

On 30 Jul 2003 19:39:17 +0200, Gabriel Dos Reis
<gdr (AT) integrable-solutions (DOT) net> wrote:

Quote:
Ça fait OO.

OOh que c'est compliqué ?


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

Back to top
Arnaud Debaene
Guest





PostPosted: Thu Jul 31, 2003 7:31 am    Post subject: Re: Construction etrange: static int* id = new int(0); Reply with quote

"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





PostPosted: Thu Jul 31, 2003 9:32 am    Post subject: Re: Construction etrange: static int* id = new int(0); Reply with quote

"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





PostPosted: Thu Jul 31, 2003 9:49 am    Post subject: Re: Construction etrange: static int* id = new int(0); Reply with quote

[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





PostPosted: Thu Jul 31, 2003 11:14 am    Post subject: Re: Construction etrange: static int* id = new int(0); Reply with quote

"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] Sad

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





PostPosted: Thu Jul 31, 2003 11:20 am    Post subject: Re: Construction etrange: static int* id = new int(0); Reply with quote

<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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.