 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
giova Guest
|
Posted: Fri May 21, 2004 12:28 pm Post subject: Probleme sur un constructeur avec un parametre par defaut |
|
|
bonjour
j'ai une classe Test avec (disons) un simple constructeur :
Test(int num=1)
{
cout<<"construceur : "<
}
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.
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Fri May 21, 2004 12:38 pm Post subject: Re: Probleme sur un constructeur avec un parametre par defau |
|
|
giova <pas (AT) de (DOT) mail> writes:
| Quote: | bonjour
j'ai une classe Test avec (disons) un simple constructeur :
Test(int num=1)
{
cout<<"construceur : "<
}
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.)
| Quote: | 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.
| Quote: | 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
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Fri May 21, 2004 12:41 pm Post subject: Re: Probleme sur un constructeur avec un parametre par defau |
|
|
On Fri, 21 May 2004 14:28:28 +0200, giova <pas (AT) de (DOT) mail> wrote:
| Quote: | j'ai une classe Test avec (disons) un simple constructeur :
Test(int num=1)
{
cout<<"construceur : "<
}
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 : "<
}
};
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 : "<
}
Ceci est une déclaration de fonction, rien à voir avec la création
d'un objet.
--
FLL, Epagneul Breton
|
|
| Back to top |
|
 |
Patrick Mézard Guest
|
Posted: Fri May 21, 2004 12:46 pm Post subject: Re: Probleme sur un constructeur avec un parametre par defau |
|
|
giova wrote:
| Quote: | bonjour
j'ai une classe Test avec (disons) un simple constructeur :
Test(int num=1)
{
cout<<"construceur : "<
}
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
class Test
{
public:
Test(int t = 1) : t_(t)
{
std::cout<
}
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
|
|
| Back to top |
|
 |
giova Guest
|
Posted: Fri May 21, 2004 12:47 pm Post subject: Re: Probleme sur un constructeur avec un parametre par defau |
|
|
Fabien LE LEZ wrote:
| Quote: | On Fri, 21 May 2004 14:28:28 +0200, giova <pas (AT) de (DOT) mail> wrote:
j'ai une classe Test avec (disons) un simple constructeur :
Test(int num=1)
{
cout<<"construceur : "<
}
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 : "<
}
};
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 : "<
}
|
héhé c'est exactement ce que j'avais fait
| Quote: |
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?
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Fri May 21, 2004 12:47 pm Post subject: Re: Probleme sur un constructeur avec un parametre par defau |
|
|
On 21 May 2004 14:38:14 +0200, Jean-Marc Bourguet <jm (AT) bourguet (DOT) org>
wrote:
| Quote: | 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
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Fri May 21, 2004 12:48 pm Post subject: Re: Probleme sur un constructeur avec un parametre par defau |
|
|
On Fri, 21 May 2004 14:47:17 +0200, giova <pas (AT) de (DOT) mail> wrote:
| Quote: | 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
|
|
| Back to top |
|
 |
giova Guest
|
Posted: Fri May 21, 2004 12:52 pm Post subject: Re: Probleme sur un constructeur avec un parametre par defau |
|
|
Jean-Marc Bourguet wrote:
| Quote: | giova <pas (AT) de (DOT) mail> writes:
bonjour
j'ai une classe Test avec (disons) un simple constructeur :
Test(int num=1)
{
cout<<"construceur : "<
}
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?
|
|
| Back to top |
|
 |
giova Guest
|
Posted: Fri May 21, 2004 1:01 pm Post subject: Re: Probleme sur un constructeur avec un parametre par defau |
|
|
Fabien LE LEZ wrote:
| Quote: | On Fri, 21 May 2004 14:47:17 +0200, giova <pas (AT) de (DOT) mail> 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 :)
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Fri May 21, 2004 1:14 pm Post subject: Re: Probleme sur un constructeur avec un parametre par defau |
|
|
giova <pas (AT) de (DOT) mail> writes:
| Quote: | 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
| Quote: | 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).
| Quote: | 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
|
|
| Back to top |
|
 |
Michel Michaud Guest
|
Posted: Fri May 21, 2004 2:09 pm Post subject: Re: Probleme sur un constructeur avec un parametre par defau |
|
|
Dans news:rkura0h2b37ogn1iddc8it5sh69c5pdk9t (AT) 4ax (DOT) com, Fabien LE
LEZ <gramster (AT) gramster (DOT) com> a écrit :
| Quote: | On Fri, 21 May 2004 14:47:17 +0200, giova <pas (AT) de (DOT) mail> 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 [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
|
|
| Back to top |
|
 |
Jean-Noël Mégoz Guest
|
Posted: Fri May 21, 2004 3:10 pm Post subject: Re: Probleme sur un constructeur avec un parametre par defau |
|
|
"giova" <pas (AT) de (DOT) mail> a écrit dans le message de
news:40adf5cb$0$19644$626a14ce (AT) news (DOT) free.fr...
| Quote: | bonjour
j'ai une classe Test avec (disons) un simple constructeur :
Test(int num=1)
{
cout<<"construceur : "<
}
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.
|
|
| Back to top |
|
 |
giova Guest
|
Posted: Fri May 21, 2004 4:01 pm Post subject: Re: Probleme sur un constructeur avec un parametre par defau |
|
|
Jean-Noël Mégoz wrote:
| Quote: | "giova" <pas (AT) de (DOT) mail> a écrit dans le message de
news:40adf5cb$0$19644$626a14ce (AT) news (DOT) free.fr...
bonjour
j'ai une classe Test avec (disons) un simple constructeur :
Test(int num=1)
{
cout<<"construceur : "<
}
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??
|
|
| Back to top |
|
 |
Jean-Noël Mégoz Guest
|
Posted: Fri May 21, 2004 8:12 pm Post subject: Re: Probleme sur un constructeur avec un parametre par defau |
|
|
"giova" <pas (AT) de (DOT) mail> a écrit dans le message de
news:40ae27b8$0$21568$626a14ce (AT) news (DOT) free.fr...
| Quote: | Jean-Noël Mégoz wrote:
"giova" <pas (AT) de (DOT) mail> a écrit dans le message de
news:40adf5cb$0$19644$626a14ce (AT) news (DOT) free.fr...
j'ai une classe Test avec (disons) un simple constructeur :
Test(int num=1)
{
cout<<"construceur : "<
}
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.
|
|
| Back to top |
|
 |
Jean-Noël Mégoz Guest
|
Posted: Fri May 21, 2004 8:54 pm Post subject: Re: Probleme sur un constructeur avec un parametre par defau |
|
|
"Jean-Noël Mégoz" <nospam_jnmegoz (AT) infonie (DOT) fr> a écrit dans le message de
news:40ae6236$0$7703$636a15ce (AT) news (DOT) free.fr...
| Quote: |
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...
|
|
| 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
|
|