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

arguments par défaut et constructeurs surchargés

2 réponses
Avatar
Nicolas Aunai
salut,

j'ai trois une classe A qui a un constructeur par défaut et deux
constructeurs surchargés, ces deux derniers ont tous leurs paramètres
qui sont des paramètres par défauts.

cela itnerdit-il la déclaration d'objet suivante ?

A a;

j'ai un message d'erreur me disant en gros qu'il ne sait pas lequel
choisir...

--
Nico,
http://astrosurf.com/nicoastro
messenger : nicolas_aunai@hotmail.com

2 réponses

Avatar
Guillaume LEMAÎTRE
Nicolas Aunai wrote:
salut,

j'ai trois une classe A qui a un constructeur par défaut et deux
constructeurs surchargés, ces deux derniers ont tous leurs paramètres
qui sont des paramètres par défauts.

cela itnerdit-il la déclaration d'objet suivante ?

A a;

j'ai un message d'erreur me disant en gros qu'il ne sait pas lequel
choisir...



Reprenons, et simplifions :

struct A {

A( void ) { ... };
A( int = 15 ) { ... };
};

A a;

Comment le compilateur pourrait-il résoudre ceci sachant que cela peut
vouloir dire à la fois A() et A(15) ?
Il faut soit ne plus avoir de constructeur par défaut, soit ne plus
donner de valeur par défaut dans le constructur à un argument.

Avatar
Anthony Fleury
Nicolas Aunai wrote:

salut,


Salut,


j'ai trois une classe A qui a un constructeur par défaut et deux
constructeurs surchargés, ces deux derniers ont tous leurs paramètres
qui sont des paramètres par défauts.

cela itnerdit-il la déclaration d'objet suivante ?

A a;

j'ai un message d'erreur me disant en gros qu'il ne sait pas lequel
choisir...



Comme le dit le compilateur, il ne peut en effet pas choisir entre les
trois...
Si ta classe est ainsi :

class A {
int a;
public :
A() {} ;
A(int x = 42) : a(x) {} ;
};

Un compilateur n'aura en effet aucun moyen de savoir lequel il doit appeler,
et dans ce cas que mettre dans a. Le comportement qui paraitrait normal
serait de prendre le constructeur sans paramètre, mais dans ce cas pourquoi
avoir mis une valeur par défaut dans le constructeur recevant un entier ?

Cependant il aurait été interessant que tu postes ton code, car hormis dans
le cas d'arguments de types différents, tu ne dois jamais rencontrer ce
cas.
Déjà, lorsque tu as un constructeur ayant toutes ses valeurs par défaut, tu
n'as pas à avoir de constructeur par défaut, le premier est déjà ton
constructeur par défaut.

Ensuite il faut savoir que si tu as ca par exemple :

class A {
int a, b;
public :
A(int x = 42, int y = 42) : a(x) , b(y) {} ;
};

Alors ta classe peut etre construite de trois valeurs différentes avec ce
seul constructeur :
A a; -> ici tu auras a = 42 et b = 42.
A a(1); ici tu auras a = 1, b = 42.
A a(1,2); ici tu auras a = 1 et b = 2.

Cet exemple est bien sûr assez bête mais ca fonctionne pareil dans un cas
général.
Tu n'as donc en toute logique aucune raison de te retrouver avec le message
d'erreur sauf dans le cas où tu auras des types différents dans tes
constructeurs, là ca dépend du cas.

Anthony
--
"I should have seen it would be this way
I should have known from the start what she's up to
When you have loved and you've lost someone
You know what it feels like to lose" -- The Rasmus