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-Marc Bourguet
giova writes:

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);


Tu peux donner un Exemple Compilable et Minimum? (non, on n'est pas
dans fctt mais c'est quand meme valable partout.)

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.


Ca devrait etre dans la FAQ... C'est une declaration pour une fonction
nommee toto sans parametres qui retourne un Test. Il y a des cas
encore plus piegeux de cette regle ou la fonction declaree peut
prendre des parametres.

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


class Test
{
public:
Test(int num);
};

Test::Test(int num = 1) {
}

void f() {
Test tata;
}

Compile chez moi sans probleme. On commence donc les devinettes, tu
n'est pas dans le fichier qui contient l'implementation et donc
l'argument par defaut n'est pas vu.

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

Avatar
Fabien LE LEZ
On Fri, 21 May 2004 14:28:28 +0200, giova wrote:

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


Ça, c'est bizarre.

Avec le code suivant il ne devrait pas y avoir de problème :

class Test
{
public:
Test (int num= 1)
{
cout<<"constructeur : "<<num<<endl;
}
};

Assure-toi d'avoir déclaré la valeur par défaut dans la définition de
la classe.
Ce code, par exemple, ne convient pas :

class Test
{
public: Test (int num);
}

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

Test toto();


Ceci est une déclaration de fonction, rien à voir avec la création
d'un objet.


--
;-)
FLL, Epagneul Breton

Avatar
Patrick Mézard
giova wrote:

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.


Le code suivant marche très bien (VC 7.1) :

#include <iostream>

class Test
{
public:
Test(int t = 1) : t_(t)
{
std::cout<<t_<<"n";
}

private:
int t_;
};

int main()
{
Test t1;
Test t2(2);
}

et affiche :

***
constructeur : 1
constructeur : 2
***

Je ne comprends pas l'erreur de compilation de ta première ligne. Ca
vient sans doute du reste du code. Quant à la deuxième ligne, c'est une
erreur classique et pas évidente au premier abord :

Test toto();

est analysée comme une déclaration de fonction (paramètre void, retourne
Test). D'ailleurs le compilateur le dit, le bougre (warning level=4).

Patrick Mézard

Avatar
giova
Fabien LE LEZ wrote:

On Fri, 21 May 2004 14:28:28 +0200, giova wrote:


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



Ça, c'est bizarre.

Avec le code suivant il ne devrait pas y avoir de problème :

class Test
{
public:
Test (int num= 1)
{
cout<<"constructeur : "<<num<<endl;
}
};

Assure-toi d'avoir déclaré la valeur par défaut dans la définition de
la classe.
Ce code, par exemple, ne convient pas :

class Test
{
public: Test (int num);
}

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


héhé c'est exactement ce que j'avais fait :)


Test toto();



Ceci est une déclaration de fonction, rien à voir avec la création
d'un objet.




tu veux dire que c'est intéprété comme etant un prototype plutot non?


Avatar
Fabien LE LEZ
On 21 May 2004 14:38:14 +0200, Jean-Marc Bourguet
wrote:

Il y a des cas
encore plus piegeux de cette regle ou la fonction declaree peut
prendre des parametres.


Heureusement, sinon on s'ennuierait ! ;-)
--
;-)
FLL, Epagneul Breton

Avatar
Fabien LE LEZ
On Fri, 21 May 2004 14:47:17 +0200, giova wrote:

Ceci est une déclaration de fonction, rien à voir avec la création
d'un objet.


tu veux dire que c'est intéprété comme etant un prototype plutot non?


C'est bien ce que j'ai dit.
--
;-)
FLL, Epagneul Breton


Avatar
giova
Jean-Marc Bourguet wrote:

giova writes:


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);



Tu peux donner un Exemple Compilable et Minimum? (non, on n'est pas
dans fctt mais c'est quand meme valable partout.)


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.



Ca devrait etre dans la FAQ... C'est une declaration pour une fonction
nommee toto sans parametres qui retourne un Test. Il y a des cas
encore plus piegeux de cette regle ou la fonction declaree peut
prendre des parametres.


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



class Test
{
public:
Test(int num);
};

Test::Test(int num = 1) {
}

void f() {
Test tata;
}

Compile chez moi sans probleme. On commence donc les devinettes, tu
n'est pas dans le fichier qui contient l'implementation et donc
l'argument par defaut n'est pas vu.

A+

donc si je comprends bien, pour déclarer dans la pile un objet de type

Test en appellant le constructeur sans parametre (ou celui avec un seul
parametre par defaut) je dois ecrire (et c'est la seule syntaxe possible) :
Test toto;

en revanche si j'avais voulu créer l'objet sur le tas, j'aurais pu
l'ecrire :

Test* toto = new Test;
ou bien :
Test* toto = new Test();

je me trompe?


Avatar
giova
Fabien LE LEZ wrote:

On Fri, 21 May 2004 14:47:17 +0200, giova wrote:


Ceci est une déclaration de fonction, rien à voir avec la création
d'un objet.


tu veux dire que c'est intéprété comme etant un prototype plutot non?



C'est bien ce que j'ai dit.
oui pardon, j'avoue etre encore un peu embrouillé entre déclaraion et

définition, ca rentre lentement :)



Avatar
Jean-Marc Bourguet
giova writes:

donc si je comprends bien, pour déclarer dans la pile un objet de type Test
en appellant le constructeur sans parametre (ou celui avec un seul
parametre par defaut)


Pour autant que le fait qu'il y a un parametre par defaut soit visible
a cet endroit

je dois ecrire (et c'est la seule syntaxe possible) :
Test toto;


Effectivement.

Test toto = Test();

a le meme effet mais appelle le constructeur par defaut puis le
constructeur de copie puis le destructeur avec autorisation pour le
compilateur d'utiliser le constructeur par defaut uniquement (mais pas
l'autorisation de sauter le test d'accessibilite du constructeur de
copie).

en revanche si j'avais voulu créer l'objet sur le tas, j'aurais pu l'ecrire:

Test* toto = new Test;
ou bien :
Test* toto = new Test();

je me trompe?


Non. En complement, dans les listes d'initialisation,
toto()
indique bien l'appel au constructeur par defaut.

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

Avatar
Michel Michaud
Dans news:, Fabien LE
On Fri, 21 May 2004 14:47:17 +0200, giova wrote:

Ceci est une déclaration de fonction, rien à voir avec la
création d'un objet.


tu veux dire que c'est intéprété comme etant un prototype
plutot non?


C'est bien ce que j'ai dit.


Sauf que C++ ne connaît pas les « prototypes » (ce mot n'est
pas utilisé dans la norme, on parle simplement de déclaration).

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/



1 2 3