 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
korchkidu Guest
|
Posted: Tue Jan 04, 2005 12:29 pm Post subject: Constructor et vector par defaut |
|
|
Bonjour,
j'ai une classe dont les objets peuvent etre construits en specifiant ou
non le dernier parametre qui est un std::vector. 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. Je me
retrouve donc a faire 2 constructeurs appelant une fonction init. Celui
qui n'a pas le parametre associe au vector le cree simplement (vide) et
appelle la fonction init. Je trouve ca plus que douteux comme solution.
Alors pourquoi la premiere solution n'etait pas correcte?
Merci d'avance,
K.
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Tue Jan 04, 2005 12:32 pm Post subject: Re: Constructor et vector par defaut |
|
|
On Tue, 04 Jan 2005 13:29:38 +0100, korchkidu <korch_ki_du (AT) yahoo (DOT) fr>:
| Quote: | 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> v= std::vector<double>());
};
--
;-)
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Tue Jan 04, 2005 12:32 pm Post subject: Re: Constructor et vector par defaut |
|
|
On Tue, 04 Jan 2005 13:29:38 +0100, korchkidu <korch_ki_du (AT) yahoo (DOT) fr>:
| Quote: | 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>());
};
--
;-)
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Tue Jan 04, 2005 12:43 pm Post subject: Re: Constructor et vector par defaut |
|
|
korchkidu <korch_ki_du (AT) yahoo (DOT) fr> writes:
| Quote: | j'ai une classe dont les objets peuvent etre construits en
specifiant ou non le dernier parametre qui est un
std::vector. 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. Je me retrouve donc a
faire 2 constructeurs appelant une fonction init. Celui qui n'a pas
le parametre associe au vector le cree simplement (vide) et appelle
la fonction init. Je trouve ca plus que douteux comme
solution. Alors pourquoi la premiere solution n'etait pas correcte?
|
La seule raison que je vois de preferer la surcharge aux parametres
avec des valeurs par defaut (mais je n'ai pas reflechi longtemps a la
question), c'est la possibilite de prendre des pointeurs vers
fonctions vers toutes les signatures. Cette raison n'est pas valable
pour les constructeurs pour lesquels a priori j'utiliserais des
parametre ayant des valeurs par defaut sans etats d'ame.
Sans connaitre les raisons qui t'ont ete donnees (etaient elles
generiques ou propres au cas en presence?), c'est difficile de
commenter plus.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Tue Jan 04, 2005 2:15 pm Post subject: Re: Constructor et vector par defaut |
|
|
In article <pxbllb99xfl.fsf (AT) news (DOT) bourguet.org>, Jean-Marc Bourguet wrote:
| Quote: | korchkidu <korch_ki_du (AT) yahoo (DOT) fr> writes:
j'ai une classe dont les objets peuvent etre construits en
specifiant ou non le dernier parametre qui est un
std::vector. 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. Je me retrouve donc a
faire 2 constructeurs appelant une fonction init. Celui qui n'a pas
le parametre associe au vector le cree simplement (vide) et appelle
la fonction init. Je trouve ca plus que douteux comme
solution. Alors pourquoi la premiere solution n'etait pas correcte?
La seule raison que je vois de preferer la surcharge aux parametres
avec des valeurs par defaut (mais je n'ai pas reflechi longtemps a la
question), c'est la possibilite de prendre des pointeurs vers
fonctions vers toutes les signatures. Cette raison n'est pas valable
pour les constructeurs pour lesquels a priori j'utiliserais des
parametre ayant des valeurs par defaut sans etats d'ame.
|
C'est à dire qu'on ne peut pas faire:
void foo(int i, double d=0);
typedef (*fun_i)(int);
typedef (*fun_i_d)(int,double);
fun_i fi= foo;
fun_i_di fid= foo;
Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Tue Jan 04, 2005 2:23 pm Post subject: Re: Constructor et vector par defaut |
|
|
Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:
| Quote: | La seule raison que je vois de preferer la surcharge aux parametres
avec des valeurs par defaut (mais je n'ai pas reflechi longtemps a la
question), c'est la possibilite de prendre des pointeurs vers
fonctions vers toutes les signatures. Cette raison n'est pas valable
pour les constructeurs pour lesquels a priori j'utiliserais des
parametre ayant des valeurs par defaut sans etats d'ame.
C'est à dire qu'on ne peut pas faire:
void foo(int i, double d=0);
typedef (*fun_i)(int);
typedef (*fun_i_d)(int,double);
fun_i fi= foo;
fun_i_di fid= foo;
|
Exact.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
|
|
| Back to top |
|
 |
korchkidu Guest
|
Posted: Tue Jan 04, 2005 5:19 pm Post subject: Re: Constructor et vector par defaut |
|
|
Fabien LE LEZ wrote:
| Quote: | On Tue, 04 Jan 2005 13:29:38 +0100, korchkidu <korch_ki_du (AT) yahoo (DOT) 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.
".
K.
|
|
| Back to top |
|
 |
korchkidu Guest
|
Posted: Tue Jan 04, 2005 5:21 pm Post subject: Re: Constructor et vector par defaut |
|
|
Marc Boyer wrote:
| Quote: | In article <pxbllb99xfl.fsf (AT) news (DOT) bourguet.org>, Jean-Marc Bourguet wrote:
korchkidu <korch_ki_du (AT) yahoo (DOT) fr> writes:
j'ai une classe dont les objets peuvent etre construits en
specifiant ou non le dernier parametre qui est un
std::vector. 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. Je me retrouve donc a
faire 2 constructeurs appelant une fonction init. Celui qui n'a pas
le parametre associe au vector le cree simplement (vide) et appelle
la fonction init. Je trouve ca plus que douteux comme
solution. Alors pourquoi la premiere solution n'etait pas correcte?
La seule raison que je vois de preferer la surcharge aux parametres
avec des valeurs par defaut (mais je n'ai pas reflechi longtemps a la
question), c'est la possibilite de prendre des pointeurs vers
fonctions vers toutes les signatures. Cette raison n'est pas valable
pour les constructeurs pour lesquels a priori j'utiliserais des
parametre ayant des valeurs par defaut sans etats d'ame.
C'est à dire qu'on ne peut pas faire:
void foo(int i, double d=0);
typedef (*fun_i)(int);
typedef (*fun_i_d)(int,double);
fun_i fi= foo;
fun_i_di fid= foo;
|
Donc en restant dans le cas des objets, ca devrait marcher si je
comprends bien...
Merci pour toutes vos reponses,
K.
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Tue Jan 04, 2005 5:41 pm Post subject: Re: Constructor et vector par defaut |
|
|
korchkidu <korch_ki_du (AT) yahoo (DOT) fr> writes:
| Quote: | Marc Boyer wrote:
C'est à dire qu'on ne peut pas faire:
void foo(int i, double d=0);
typedef (*fun_i)(int);
typedef (*fun_i_d)(int,double);
fun_i fi= foo;
fun_i_di fid= foo;
Donc en restant dans le cas des objets, ca devrait marcher si je
comprends bien...
|
Je ne comprend pas ce que tu veux dire ...
--drkm
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Tue Jan 04, 2005 5:48 pm Post subject: Re: Constructor et vector par defaut |
|
|
korchkidu <korch_ki_du (AT) yahoo (DOT) fr> writes:
| Quote: | Fabien LE LEZ wrote:
On Tue, 04 Jan 2005 13:29:38 +0100, korchkidu <korch_ki_du (AT) yahoo (DOT) 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...
|
Mais de quels problèmes parle-t-elle ?
| Quote: | Le mot de la fin etant "This is definitely not a good way how to
ensure that something is initialized.
".
|
Cette personne serait-elle intéressée à partager son point de vue ?
J'avoue ne toujours pas voir de quels problèmes elle parle.
--drkm
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Tue Jan 04, 2005 7:12 pm Post subject: Re: Constructor et vector par defaut |
|
|
On Tue, 04 Jan 2005 18:19:36 +0100, korchkidu <korch_ki_du (AT) yahoo (DOT) fr>:
| Quote: | 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...
|
Mouais... Rien de bien convaincant, en tout cas.
Je te rassure, C++ gère parfaitement bien ce cas.
--
;-)
|
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Tue Jan 04, 2005 8:32 pm Post subject: Re: Constructor et vector par defaut |
|
|
korchkidu wrote:
| Quote: | Fabien LE LEZ wrote:
On Tue, 04 Jan 2005 13:29:38 +0100, korchkidu <korch_ki_du (AT) yahoo (DOT) 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...
|
La question alors est : qu'est-ce que tu fais avec ce vector
dans ton constructeur ? 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. Sinon, il risque d'avoir des
problèmes dans tous les cas, même quand tu te sers pas de la
valeur par défaut.
| Quote: | 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. Mais si tu copies le
vector, il ne doit pas y avoir de problèmes.
--
James Kanze home: www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Tue Jan 04, 2005 10:10 pm Post subject: Re: Constructor et vector par defaut |
|
|
James Kanze <kanze@none> writes:
| Quote: | 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.
--drkm
|
|
| Back to top |
|
 |
Vladimir Votiakov Guest
|
Posted: Tue Jan 04, 2005 10:47 pm Post subject: Re: Constructor et vector par defaut |
|
|
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.
"Fabien LE LEZ" <gramster (AT) gramster (DOT) com> wrote
| Quote: | On Tue, 04 Jan 2005 13:29:38 +0100, korchkidu <korch_ki_du (AT) yahoo (DOT) 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>());
};
--
|
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Tue Jan 04, 2005 11:57 pm Post subject: Re: Constructor et vector par defaut |
|
|
"Vladimir Votiakov" <vvot.2004XXX (AT) 9online (DOT) fr> writes:
| Quote: | J'ai envie d'appeler ce genre de code de l'abus de intelligence
de compilateur.
|
Que vient faire ici l'intelligence du compilateur ?
| Quote: | 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.
| Quote: | 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 ) {
// ...
}
?
--drkm
|
|
| 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
|
|