Fabien LE LEZ wrote:
On Tue, 04 Jan 2005 13:29:38 +0100, korchkidu :
J'avais donc simplement utilise un parametre par defaut qui
mettait le vector vide s'il n'etait pas initialise. Mais
dernierement, on me dit (avec des explications fumeuses que
je n'ai pas comprises...) qu'il fallait pas faire ca.
Ah ? Je veux bien voir les explications en question.
Apres avoir redemande a la personne en question, le vector
serait cree sur la pile ce qui pourrait causer des problemes
lors de la destruction (lorsque la fonction retourne)...C'est
pas plus clair que ca...
Le mot de la fin etant "This is definitely not a good way how
to ensure that something is initialized."
Fabien LE LEZ wrote:
On Tue, 04 Jan 2005 13:29:38 +0100, korchkidu <korch_ki_du@yahoo.fr>:
J'avais donc simplement utilise un parametre par defaut qui
mettait le vector vide s'il n'etait pas initialise. Mais
dernierement, on me dit (avec des explications fumeuses que
je n'ai pas comprises...) qu'il fallait pas faire ca.
Ah ? Je veux bien voir les explications en question.
Apres avoir redemande a la personne en question, le vector
serait cree sur la pile ce qui pourrait causer des problemes
lors de la destruction (lorsque la fonction retourne)...C'est
pas plus clair que ca...
Le mot de la fin etant "This is definitely not a good way how
to ensure that something is initialized."
Fabien LE LEZ wrote:
On Tue, 04 Jan 2005 13:29:38 +0100, korchkidu :
J'avais donc simplement utilise un parametre par defaut qui
mettait le vector vide s'il n'etait pas initialise. Mais
dernierement, on me dit (avec des explications fumeuses que
je n'ai pas comprises...) qu'il fallait pas faire ca.
Ah ? Je veux bien voir les explications en question.
Apres avoir redemande a la personne en question, le vector
serait cree sur la pile ce qui pourrait causer des problemes
lors de la destruction (lorsque la fonction retourne)...C'est
pas plus clair que ca...
Le mot de la fin etant "This is definitely not a good way how
to ensure that something is initialized."
korchkidu wrote:Le mot de la fin etant "This is definitely not a good way how
to ensure that something is initialized."
Ce n'est pas une bonne solution pour initialiser une référence
ou un pointeur dans l'objet, c'est sûr.
korchkidu wrote:
Le mot de la fin etant "This is definitely not a good way how
to ensure that something is initialized."
Ce n'est pas une bonne solution pour initialiser une référence
ou un pointeur dans l'objet, c'est sûr.
korchkidu wrote:Le mot de la fin etant "This is definitely not a good way how
to ensure that something is initialized."
Ce n'est pas une bonne solution pour initialiser une référence
ou un pointeur dans l'objet, c'est sûr.
On Tue, 04 Jan 2005 13:29:38 +0100, korchkidu :J'avais donc simplement
utilise un parametre par defaut qui mettait le vector vide s'il n'etait
pas initialise. Mais dernierement, on me dit (avec des explications
fumeuses que je n'ai pas comprises...) qu'il fallait pas faire ca.
Ah ? Je veux bien voir les explications en question.
Personnellement, la construction suivante ne m'a jamais gêné :
class C
{
public:
C (int i, std::vector<double> const& v= std::vector<double>());
};
--
;-)
On Tue, 04 Jan 2005 13:29:38 +0100, korchkidu <korch_ki_du@yahoo.fr>:
J'avais donc simplement
utilise un parametre par defaut qui mettait le vector vide s'il n'etait
pas initialise. Mais dernierement, on me dit (avec des explications
fumeuses que je n'ai pas comprises...) qu'il fallait pas faire ca.
Ah ? Je veux bien voir les explications en question.
Personnellement, la construction suivante ne m'a jamais gêné :
class C
{
public:
C (int i, std::vector<double> const& v= std::vector<double>());
};
--
;-)
On Tue, 04 Jan 2005 13:29:38 +0100, korchkidu :J'avais donc simplement
utilise un parametre par defaut qui mettait le vector vide s'il n'etait
pas initialise. Mais dernierement, on me dit (avec des explications
fumeuses que je n'ai pas comprises...) qu'il fallait pas faire ca.
Ah ? Je veux bien voir les explications en question.
Personnellement, la construction suivante ne m'a jamais gêné :
class C
{
public:
C (int i, std::vector<double> const& v= std::vector<double>());
};
--
;-)
J'ai envie d'appeler ce genre de code de l'abus de intelligence
de compilateur.
A quoi ça sert de créer un objet sur stack pour le balancer aussitôt ?
A mon avis, il est plus logique d'avoir 2 constructeurs
sans paramètre et avec le paramètre et si tu veut
partager du code entre les deux, une petite fonction
(inline) initialize(), par exemple.
J'ai envie d'appeler ce genre de code de l'abus de intelligence
de compilateur.
A quoi ça sert de créer un objet sur stack pour le balancer aussitôt ?
A mon avis, il est plus logique d'avoir 2 constructeurs
sans paramètre et avec le paramètre et si tu veut
partager du code entre les deux, une petite fonction
(inline) initialize(), par exemple.
J'ai envie d'appeler ce genre de code de l'abus de intelligence
de compilateur.
A quoi ça sert de créer un objet sur stack pour le balancer aussitôt ?
A mon avis, il est plus logique d'avoir 2 constructeurs
sans paramètre et avec le paramètre et si tu veut
partager du code entre les deux, une petite fonction
(inline) initialize(), par exemple.
La question alors est : qu'est-ce que tu fais avec ce vector
dans ton constructeur ?
C'est un vecteur de pointeurs que j'itere pour initialiser mes donnees.
Parce qu'il serait bien détruit à la fin
de l'expression qui invoque le constructeur. Alors, si tu en as
fait une copie, aucun problème.
C'est des pointeurs sur des objets qui ne sont jamais detruits.
La question alors est : qu'est-ce que tu fais avec ce vector
dans ton constructeur ?
C'est un vecteur de pointeurs que j'itere pour initialiser mes donnees.
Parce qu'il serait bien détruit à la fin
de l'expression qui invoque le constructeur. Alors, si tu en as
fait une copie, aucun problème.
C'est des pointeurs sur des objets qui ne sont jamais detruits.
La question alors est : qu'est-ce que tu fais avec ce vector
dans ton constructeur ?
C'est un vecteur de pointeurs que j'itere pour initialiser mes donnees.
Parce qu'il serait bien détruit à la fin
de l'expression qui invoque le constructeur. Alors, si tu en as
fait une copie, aucun problème.
C'est des pointeurs sur des objets qui ne sont jamais detruits.
A quoi ça sert de créer un objet sur stack pour le balancer aussitôt ?
De cette maniere j'ai un constructeur au lieu de 2.
A quoi ça sert de créer un objet sur stack pour le balancer aussitôt ?
De cette maniere j'ai un constructeur au lieu de 2.
A quoi ça sert de créer un objet sur stack pour le balancer aussitôt ?
De cette maniere j'ai un constructeur au lieu de 2.
J'ai envie d'appeler ce genre de code de l'abus de intelligence
de compilateur.
A quoi ça sert de créer un objet sur stack pour le balancer aussitôt ?
A mon avis, il est plus logique d'avoir 2 constructeurs
sans paramètre et avec le paramètre et si tu veut
partager du code entre les deux, une petite fonction
(inline) initialize(), par exemple.
J'ai envie d'appeler ce genre de code de l'abus de intelligence
de compilateur.
A quoi ça sert de créer un objet sur stack pour le balancer aussitôt ?
A mon avis, il est plus logique d'avoir 2 constructeurs
sans paramètre et avec le paramètre et si tu veut
partager du code entre les deux, une petite fonction
(inline) initialize(), par exemple.
J'ai envie d'appeler ce genre de code de l'abus de intelligence
de compilateur.
A quoi ça sert de créer un objet sur stack pour le balancer aussitôt ?
A mon avis, il est plus logique d'avoir 2 constructeurs
sans paramètre et avec le paramètre et si tu veut
partager du code entre les deux, une petite fonction
(inline) initialize(), par exemple.
James Kanze writes:korchkidu wrote:Le mot de la fin etant "This is definitely not a good way
how to ensure that something is initialized."
Ce n'est pas une bonne solution pour initialiser une
référence ou un pointeur dans l'objet, c'est sûr.
Prendre l'adresse d'un objet passé par référence constante
(et le stocker pour après la fin de la fonction), c'est
vicieux. Et si ce paramètre a de plus une valeur par défaut
...
Mais ce n'est alors pas le fait d'avoir une valeur par
défaut à mettre en cause, ÀMHA, mais le passage par référence
plutôt que d'un pointeur.
James Kanze <kanze@none> writes:
korchkidu wrote:
Le mot de la fin etant "This is definitely not a good way
how to ensure that something is initialized."
Ce n'est pas une bonne solution pour initialiser une
référence ou un pointeur dans l'objet, c'est sûr.
Prendre l'adresse d'un objet passé par référence constante
(et le stocker pour après la fin de la fonction), c'est
vicieux. Et si ce paramètre a de plus une valeur par défaut
...
Mais ce n'est alors pas le fait d'avoir une valeur par
défaut à mettre en cause, ÀMHA, mais le passage par référence
plutôt que d'un pointeur.
James Kanze writes:korchkidu wrote:Le mot de la fin etant "This is definitely not a good way
how to ensure that something is initialized."
Ce n'est pas une bonne solution pour initialiser une
référence ou un pointeur dans l'objet, c'est sûr.
Prendre l'adresse d'un objet passé par référence constante
(et le stocker pour après la fin de la fonction), c'est
vicieux. Et si ce paramètre a de plus une valeur par défaut
...
Mais ce n'est alors pas le fait d'avoir une valeur par
défaut à mettre en cause, ÀMHA, mais le passage par référence
plutôt que d'un pointeur.
James Kanze wrote:La question alors est : qu'est-ce que tu fais avec ce vector
dans ton constructeur ?
C'est un vecteur de pointeurs que j'itere pour initialiser mes
donnees.Parce qu'il serait bien détruit à la fin de l'expression qui
invoque le constructeur. Alors, si tu en as fait une copie,
aucun problème.
C'est des pointeurs sur des objets qui ne sont jamais detruits.
James Kanze wrote:
La question alors est : qu'est-ce que tu fais avec ce vector
dans ton constructeur ?
C'est un vecteur de pointeurs que j'itere pour initialiser mes
donnees.
Parce qu'il serait bien détruit à la fin de l'expression qui
invoque le constructeur. Alors, si tu en as fait une copie,
aucun problème.
C'est des pointeurs sur des objets qui ne sont jamais detruits.
James Kanze wrote:La question alors est : qu'est-ce que tu fais avec ce vector
dans ton constructeur ?
C'est un vecteur de pointeurs que j'itere pour initialiser mes
donnees.Parce qu'il serait bien détruit à la fin de l'expression qui
invoque le constructeur. Alors, si tu en as fait une copie,
aucun problème.
C'est des pointeurs sur des objets qui ne sont jamais detruits.
drkm wrote:"Vladimir Votiakov" writes:A quoi ça sert de créer un objet sur stack pour le balancer
aussitôt ?
Tout dépend de ce que l'on appelle « aussitôt ». Le temps
d'exécution d'une fonction ne me semble pas un grain trop
fin.
J'aurais plutôt dit : à quoi sert de créer un objet temporaire
si on ne va pas s'en servir ? Dans le cas présent, je ne vois
pas à quoi va bien pouvoir servir le vecteur vide.
A mon avis, il est plus logique d'avoir 2 constructeurs sans
paramètre et avec le paramètre et si tu veut partager du
code entre les deux, une petite fonction (inline)
initialize(), par exemple.
Dans le cas présent, je ne vois pas l'utilité. Ça me
semblerait presque de l'obfuscation, dans le cas présent. On
parle bien de quelque chose comme :
void f( T const & t = T() ) {
// ...
}
vs. :
void f() {
T t ;
init( t ) ;
}
void f( T const & t ) {
init( t ) ;
}
void init( T const & t ) {
// ...
}
?
Ce qui manque dans ton exemple, c'est le contenu de la méthode
"init" : A-t-on vraiment besoin d'écrire un code générique
pour les 2 cas de surcharge, surtout si T est un vecteur et
que l'on ne va probablement pas faire le même chose quand le
vecteur est vide ?
cf Item 24 dans Effective C++.
Une autre façon de voir l'obfuscation, c'est le fait de
privilégier des écritures génériques aux écritures qui
expriment clairement l'intention du développeur.
Dans le cas présent, si on a besoin de créer 3 itérateurs sur
le vecteur,
il y a fort à parier que ni la méthode init( T const & t ), ni
la valeur par défaut ne sont justifiés.
(ce qui n'empêche pas de conserver une autre méthode init sans
paramètre pour partager du code) :
void f() {
// code d'initialisation avec t "vide"
init() ;
}
void f( T const & t ) {
// code d'initialisation avec t "non vide"
init() ;
}
void init() {
// ...
}
drkm wrote:
"Vladimir Votiakov" <vvot.2004XXX@9online.fr> writes:
A quoi ça sert de créer un objet sur stack pour le balancer
aussitôt ?
Tout dépend de ce que l'on appelle « aussitôt ». Le temps
d'exécution d'une fonction ne me semble pas un grain trop
fin.
J'aurais plutôt dit : à quoi sert de créer un objet temporaire
si on ne va pas s'en servir ? Dans le cas présent, je ne vois
pas à quoi va bien pouvoir servir le vecteur vide.
A mon avis, il est plus logique d'avoir 2 constructeurs sans
paramètre et avec le paramètre et si tu veut partager du
code entre les deux, une petite fonction (inline)
initialize(), par exemple.
Dans le cas présent, je ne vois pas l'utilité. Ça me
semblerait presque de l'obfuscation, dans le cas présent. On
parle bien de quelque chose comme :
void f( T const & t = T() ) {
// ...
}
vs. :
void f() {
T t ;
init( t ) ;
}
void f( T const & t ) {
init( t ) ;
}
void init( T const & t ) {
// ...
}
?
Ce qui manque dans ton exemple, c'est le contenu de la méthode
"init" : A-t-on vraiment besoin d'écrire un code générique
pour les 2 cas de surcharge, surtout si T est un vecteur et
que l'on ne va probablement pas faire le même chose quand le
vecteur est vide ?
cf Item 24 dans Effective C++.
Une autre façon de voir l'obfuscation, c'est le fait de
privilégier des écritures génériques aux écritures qui
expriment clairement l'intention du développeur.
Dans le cas présent, si on a besoin de créer 3 itérateurs sur
le vecteur,
il y a fort à parier que ni la méthode init( T const & t ), ni
la valeur par défaut ne sont justifiés.
(ce qui n'empêche pas de conserver une autre méthode init sans
paramètre pour partager du code) :
void f() {
// code d'initialisation avec t "vide"
init() ;
}
void f( T const & t ) {
// code d'initialisation avec t "non vide"
init() ;
}
void init() {
// ...
}
drkm wrote:"Vladimir Votiakov" writes:A quoi ça sert de créer un objet sur stack pour le balancer
aussitôt ?
Tout dépend de ce que l'on appelle « aussitôt ». Le temps
d'exécution d'une fonction ne me semble pas un grain trop
fin.
J'aurais plutôt dit : à quoi sert de créer un objet temporaire
si on ne va pas s'en servir ? Dans le cas présent, je ne vois
pas à quoi va bien pouvoir servir le vecteur vide.
A mon avis, il est plus logique d'avoir 2 constructeurs sans
paramètre et avec le paramètre et si tu veut partager du
code entre les deux, une petite fonction (inline)
initialize(), par exemple.
Dans le cas présent, je ne vois pas l'utilité. Ça me
semblerait presque de l'obfuscation, dans le cas présent. On
parle bien de quelque chose comme :
void f( T const & t = T() ) {
// ...
}
vs. :
void f() {
T t ;
init( t ) ;
}
void f( T const & t ) {
init( t ) ;
}
void init( T const & t ) {
// ...
}
?
Ce qui manque dans ton exemple, c'est le contenu de la méthode
"init" : A-t-on vraiment besoin d'écrire un code générique
pour les 2 cas de surcharge, surtout si T est un vecteur et
que l'on ne va probablement pas faire le même chose quand le
vecteur est vide ?
cf Item 24 dans Effective C++.
Une autre façon de voir l'obfuscation, c'est le fait de
privilégier des écritures génériques aux écritures qui
expriment clairement l'intention du développeur.
Dans le cas présent, si on a besoin de créer 3 itérateurs sur
le vecteur,
il y a fort à parier que ni la méthode init( T const & t ), ni
la valeur par défaut ne sont justifiés.
(ce qui n'empêche pas de conserver une autre méthode init sans
paramètre pour partager du code) :
void f() {
// code d'initialisation avec t "vide"
init() ;
}
void f( T const & t ) {
// code d'initialisation avec t "non vide"
init() ;
}
void init() {
// ...
}