Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme sur un constructeur avec un parametre par defaut

24 réponses
Avatar
giova
bonjour

j'ai une classe Test avec (disons) un simple constructeur :

Test(int num=1)
{
cout<<"construceur : "<<num<<endl;
}

ensuite j'ai ceci dans mon main :

Test tata; //erreur a la compilation
Test toto();
Test titi(5);

Bon pour le probleme de tata je pense avoir compris : en créant le
constructeur a un parametre, on perd le constructeur par defaut, oui
mais c'est quand meme bizare, je vais y venir.

Mon probleme est que la ligne Test toto(); semble ne pas etre éxécutée.

j'utilise VC 2003 et lorsque je débug apres avoir placé un point d'arret
sur Test toto(); le programme se met en pause sur l'instruction
suivante, comme si Test toto(); ne comprennait aucune instruction.
j'ai égallement placé un point d'arret a l'interieur du constructeur,
pour etre sur de savoir quand il est lancé, or, seul Test titi(5) semble
l'appeller.
et pour finir dans le debuggeur "variable locales" seul titi apparait.

alors je ne comprends pas pourquoi Test toto() n'appelle pas le
constructeur avec un parametre par defaut ???
pourquoi la ligne semble ignorée sans qu'on m'avertisse de quoi que ce
soit lors la compil ou lors du debuggage? Je veux dire, soit le
compilateur me jete, soit le programme plante, soit il me construit
toto, mais la vraiment j'ai rien !!!

idem pour Test tata; pourquoi ne peut on pas "traduire" cette ligne par
Test tata(int num=1) soit => Test tata(1); ???

merci d'avance pour les lumieres que vous allez m'apporter.

10 réponses

1 2 3
Avatar
Jean-Noël Mégoz
"giova" a écrit dans le message de
news:40adf5cb$0$19644$
bonjour

j'ai une classe Test avec (disons) un simple constructeur :

Test(int num=1)
{
cout<<"construceur : "<<num<<endl;
}

alors je ne comprends pas pourquoi Test toto() n'appelle pas le
constructeur avec un parametre par defaut ???


J'ai bien lu tout ce que les autres ont répondu, mais personne, me
semble-t-il n'a simplement indiqué que le constructeur donné ici n'est *pas*
un "constructeur avec un paramètre par défaut", mais un "constructeur avec
un paramètre entier ayant une valeur par défaut".
Si j'ai bien tout compris au c++, ça fait une différence, et de taille !
J.No.

Avatar
giova
Jean-Noël Mégoz wrote:
"giova" a écrit dans le message de
news:40adf5cb$0$19644$

bonjour

j'ai une classe Test avec (disons) un simple constructeur :

Test(int num=1)
{
cout<<"construceur : "<<num<<endl;
}

alors je ne comprends pas pourquoi Test toto() n'appelle pas le
constructeur avec un parametre par defaut ???



J'ai bien lu tout ce que les autres ont répondu, mais personne, me
semble-t-il n'a simplement indiqué que le constructeur donné ici n'est *pas*
un "constructeur avec un paramètre par défaut", mais un "constructeur avec
un paramètre entier ayant une valeur par défaut".
Si j'ai bien tout compris au c++, ça fait une différence, et de taille !
J.No.




Hmm mais c'est quoi un constructeur avec un parametre par defaut pour
toi dans ce cas??


Avatar
Jean-Noël Mégoz
"giova" a écrit dans le message de
news:40ae27b8$0$21568$
Jean-Noël Mégoz wrote:
"giova" a écrit dans le message de
news:40adf5cb$0$19644$

j'ai une classe Test avec (disons) un simple constructeur :

Test(int num=1)
{
cout<<"construceur : "<<num<<endl;
}

alors je ne comprends pas pourquoi Test toto() n'appelle pas le
constructeur avec un parametre par defaut ???



Hmm mais c'est quoi un constructeur avec un parametre par defaut pour
toi dans ce cas??


Ben ce n'est rien, justement ! Ça n'existe pas !
Selon ton message initial, tu voulais que "Test toto();" soit interprété
comme "Test toto(1);"... Et ça, c'est impossible.



Avatar
Jean-Noël Mégoz
"Jean-Noël Mégoz" a écrit dans le message de
news:40ae6236$0$7703$


Ben ce n'est rien, justement ! Ça n'existe pas !
Selon ton message initial, tu voulais que "Test toto();" soit interprété
comme "Test toto(1);"... Et ça, c'est impossible.

Je crois que j'ai perdu une occasion de me taire ! Désolé, je réalise en me

relisant que c'est tout à fait possible ! Je me disais que la surcharge des
fonctions étant basée sur les types et le nombre des arguments, on ne
pouvait passer de 0 à 1 paramètres. Mais bon, j'ai tout faux, désolé.
Par contre, maintenant que je réalise mon erreur, je tique sur un cas...
tordu, certes, mais concevable.

Soit une classe Classe, dont on définit 2 constructeurs ainsi :
Classe::Classe(int i=0)
{
cout << "argument entier" << endl;
}
Classe::Classe(float f=0.0)
{
cout << "argument flottant" << endl;
}

Lors de l'instanciation :
Classe objet;
quel constructeur sera appelé par défaut ? Le 1er ? Le 2nd ? Ou on a alors
un comportement indéterminé du programme ? À moins que ce ne soit le compilo
qui hurle, dans ce cas...

Avatar
Fabien LE LEZ
On Fri, 21 May 2004 22:54:19 +0200, "Jean-Noël Mégoz"
wrote:

Selon ton message initial, tu voulais que "Test toto();" soit interprété
comme "Test toto(1);"... Et ça, c'est impossible.

Je crois que j'ai perdu une occasion de me taire ! Désolé, je réalise en me

relisant que c'est tout à fait possible !


Uh ? Comment ça ?
Une déclaration de fonction peut être interprétée comme la création
d'un objet ?

Va être temps que j'aille me coucher, j'ai vraiment du mal à suivre
:-/

--
;-)
FLL, Epagneul Breton


Avatar
Alain Naigeon
"Jean-Noël Mégoz" a écrit dans le message news:
40ae6c08$0$7708$


Soit une classe Classe, dont on définit 2 constructeurs ainsi :
Classe::Classe(int i=0)
{
cout << "argument entier" << endl;
}
Classe::Classe(float f=0.0)
{
cout << "argument flottant" << endl;
}

Lors de l'instanciation :
Classe objet;
quel constructeur sera appelé par défaut ? Le 1er ? Le 2nd ? Ou on a alors
un comportement indéterminé du programme ? À moins que ce ne soit le
compilo

qui hurle, dans ce cas...


J'"intuitionne" la même chose que toi, et je crois en avoir trouvé
la confirmation en 8.5.14 "Initializers", qui précise à plusieurs reprises
qu'en cas de construction impossible (certes !) ou ambigüe, alors
l'expression d'initialisation est mal formée. Bon, mais, ce que j'en
pense, moi... Dans ce genre de cas je joue à être le compilateur,
et là je vois que je serais très embêté, alors... ça semble confirmer !
[ne pinaillons pas sur le fait que l'argument n'est pas utilisé dans
ton exemple, c'est pour ne pas entrer dans les détails, je suppose].

Maintenant, que j'aie vu juste ou pas sur ce qui précède, je suppose
que si l'on avait un troisième constructeur :
Classe::Classe() {...}
l'ambigüité serait, dans ce cas, résolue, et c'est ce dernier constructeur
qui serait choisi ? Le constructeur sans argument serait alors choisi en
priorité, plutôt qu'un constructeur avec un argument ayant une valeur
par défaut ?

De plus, je me pose la question : est-ce que la possibilité d'une
ambigüité (la syntaxe) est déjà fautive, ou bien est-ce seulement
la rencontre d'une réelle ambigüité nécessitée par l'implémentation
qui déclenche l'erreur ?
Comme j'ai des doutes sur ma phrase un peu tordue, je repose la
question plus concrètement : avec Classe objet (350); on ne rencontre
pas vraiment l'ambiguïté, donc... ça passe, *bien que* le code en
question soit potentiellement vicieux (justement dans le cas que
tu citais) ?

Remarque, là, entre nous, on est en train de tester les copains
experts plutôt que le langage, parce qu'il suffirait de peu de
travail pour tester. Sur un cas aussi énorme, on peut espérer
que tous les compilos se comportent de la même façon !

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France

Avatar
Gabriel Dos Reis
"Jean-Noël Mégoz" writes:

| "giova" a écrit dans le message de
| news:40ae27b8$0$21568$
| > Jean-Noël Mégoz wrote:
| >> "giova" a écrit dans le message de
| >> news:40adf5cb$0$19644$
| >>
| >>> j'ai une classe Test avec (disons) un simple constructeur :
| >>>
| >>> Test(int num=1)
| >>> {
| >>> cout<<"construceur : "<<num<<endl;
| >>> }
| >>>
| >>> alors je ne comprends pas pourquoi Test toto() n'appelle pas le
| >>> constructeur avec un parametre par defaut ???
| >
| > Hmm mais c'est quoi un constructeur avec un parametre par defaut pour
| > toi dans ce cas??
|
| Ben ce n'est rien, justement ! Ça n'existe pas !

Je ne comprends pas.

| Selon ton message initial, tu voulais que "Test toto();" soit interprété
| comme "Test toto(1);"... Et ça, c'est impossible.

-- Gaby
Avatar
Gabriel Dos Reis
"Jean-Noël Mégoz" writes:

[...]

| Soit une classe Classe, dont on définit 2 constructeurs ainsi :
| Classe::Classe(int i=0)
| {
| cout << "argument entier" << endl;
| }
| Classe::Classe(float f=0.0)
| {
| cout << "argument flottant" << endl;
| }
|
| Lors de l'instanciation :
| Classe objet;

C'est une déclaration de variable, mais il y a ambiguité pour le
constructeur à utiliser. Donc erreur.

-- Gaby
Avatar
Gabriel Dos Reis
"Alain Naigeon" writes:


[...]

| Maintenant, que j'aie vu juste ou pas sur ce qui précède, je suppose

Tu as vu juste.

| que si l'on avait un troisième constructeur :
| Classe::Classe() {...}
| l'ambigüité serait, dans ce cas, résolue, et c'est ce dernier constructeur
| qui serait choisi ?

Non. Toujours ambiguité -- quelqu'un qui écrit des trucs comme ça
cheche vraiment des problèmes.

| Le constructeur sans argument serait alors choisi en
| priorité, plutôt qu'un constructeur avec un argument ayant une valeur
| par défaut ?
|
| De plus, je me pose la question : est-ce que la possibilité d'une
| ambigüité (la syntaxe) est déjà fautive, ou bien est-ce seulement
| la rencontre d'une réelle ambigüité nécessitée par l'implémentation
| qui déclenche l'erreur ?

C'est la résolution de surcharge qui pose problème.

| Comme j'ai des doutes sur ma phrase un peu tordue, je repose la
| question plus concrètement : avec Classe objet (350); on ne rencontre
| pas vraiment l'ambiguïté, donc... ça passe, *bien que* le code en
| question soit potentiellement vicieux (justement dans le cas que
| tu citais) ?

Oui. 350 est de type int, il y a un constructeur qui prend un int,
exact match donc c'est bon.

| Remarque, là, entre nous, on est en train de tester les copains
| experts plutôt que le langage, parce qu'il suffirait de peu de
| travail pour tester. Sur un cas aussi énorme, on peut espérer
| que tous les compilos se comportent de la même façon !

En effet.

-- Gaby
Avatar
Jean-Noël Mégoz
"Fabien LE LEZ" a écrit dans le message de
news:
On Fri, 21 May 2004 22:54:19 +0200, "Jean-Noël Mégoz"
wrote:

Selon ton message initial, tu voulais que "Test toto();" soit
interprété



comme "Test toto(1);"... Et ça, c'est impossible.

Je crois que j'ai perdu une occasion de me taire ! Désolé, je réalise en

me


relisant que c'est tout à fait possible !


Uh ? Comment ça ?
Une déclaration de fonction peut être interprétée comme la création
d'un objet ?

Va être temps que j'aille me coucher, j'ai vraiment du mal à suivre
:-/


Laisse tomber, c'est moi qui m'exprime mal...
J'envisageais ici "Test toto();" comme une création d'objet de classe Test,
bien que ce soit faux, pour reprendre l'idée de départ de Giova...
Mais bon, il s'est trompé, je me suis planté, et 2 erreurs ne s'annulant
pas, cette conversation ne rime à rien !
Coupez !



1 2 3