C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Héritage et constructeur

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
AG
Guest





PostPosted: Wed May 02, 2007 10:21 pm    Post subject: Héritage et constructeur Reply with quote



Bonjour,

soit le code suivant :

class A
{
int debut;
int fin;
A(int a, int b){debut=1;fin=2;};
};

class B : public A
{
B(int a, int b):A::A(a,b){};
};

Mon compilo Visual C++ bloque sur B(int a, int b): A::A(a,b) {};

il lui faut : B(int a, int b): A(a,b) {};

Est-ce vraiment une erreur ? gcc ne dit pas qu'il s'agit d'une erreur.

AG.
Back to top
Fabien LE LEZ
Guest





PostPosted: Wed May 02, 2007 10:43 pm    Post subject: Re: Héritage et constructeur Reply with quote



On Wed, 2 May 2007 19:21:33 +0200, "AG" <ag (AT) tb (DOT) fr>:

Quote:
Mon compilo Visual C++ bloque sur B(int a, int b): A::A(a,b) {};

Est-ce vraiment une erreur ?

Je ne suis pas totalement sûr qu'il s'agisse d'une erreur, mais c'est
très certainement une incongruité.
Back to top
Alain Gaillard
Guest





PostPosted: Thu May 03, 2007 2:15 pm    Post subject: Re: Héritage et constructeur Reply with quote



Quote:
Je ne suis pas totalement sûr qu'il s'agisse d'une erreur,

Je n'en suis pas sûr non plus. Mais une fois n'est pas coutume, je
donnerais raison à Visual :)

Quote:
mais c'est
très certainement une incongruité.

C'est le moins que l'on puisse dire.
Pourquoi utiliser l'opérateur de résolution de portée dans

B(int a, int b): A::A(a,b) {};

Ca n'a pas de sens. Parce qu'il n'existe pas de constructeur virtuel alors
quand on écrit normalement

B(int a, int b): A(a,b) {};

on est sûr que c'est bien le constructeur de A qui est appelé.

Est-ce une erreur ? la question serait plutôt, est-ce qu'en
programmation faire un pléonasme est une erreur ou pas ? Wink


--
Alain
Back to top
Alain Gaillard
Guest





PostPosted: Thu May 03, 2007 2:20 pm    Post subject: Re: Héritage et constructeur Reply with quote

Quote:
Je ne suis pas totalement sûr qu'il s'agisse d'une erreur,

Je n'en suis pas sûr non plus. Mais une fois n'est pas coutume, je
donnerais raison à Visual :)

Quote:
mais c'est
très certainement une incongruité.

C'est le moins que l'on puisse dire.
Pourquoi utiliser l'opérateur de résolution de portée dans

B(int a, int b): A::A(a,b) {};

Ca n'a pas de sens. Parce qu'il n'existe pas de constructeur virtuel alors
quand on écrit normalement

B(int a, int b): A(a,b) {};

on est sûr que c'est bien le constructeur de A qui est appelé.
D'autant plus qu'il n'y a pas d'instance de A existante à ce stade :)

Est-ce une erreur ? la question serait plutôt, est-ce qu'en
programmation faire un pléonasme est une erreur ou pas ? Wink
Back to top
Fabien LE LEZ
Guest





PostPosted: Thu May 03, 2007 6:47 pm    Post subject: Re: Héritage et constructeur Reply with quote

On Thu, 03 May 2007 11:15:02 +0200, Alain Gaillard
<alain_gaillard28 (AT) hotmail (DOT) fr>:

Quote:
Est-ce une erreur ? la question serait plutôt, est-ce qu'en
programmation faire un pléonasme est une erreur ou pas ? Wink

Il me semble qu'employer inutilement une façon différente de la
méthode habituelle, est une erreur en soi, puisqu'elle rend la
relecture plus difficile.
Back to top
James Kanze
Guest





PostPosted: Thu May 03, 2007 8:20 pm    Post subject: Re: Héritage et constructeur Reply with quote

On May 3, 11:15 am, Alain Gaillard <alain_gaillar...@hotmail.fr>
wrote:
Quote:
Je ne suis pas totalement sûr qu'il s'agisse d'une erreur,

Je n'en suis pas sûr non plus. Mais une fois n'est pas coutume, je
donnerais raison à Visual Smile

Je ne suis pas sûr. Le nom de la classe est injectée dans la
classe -- si j'écris donc A::A, on va chercher A dans A, et
puisque le nom y est, on le retrouve. Et ainsi de suite : A,
A::A, A::A::A, A::A::A::A... signifie tous la même chose, la
classe A.

Sauf que, évidemment, dans certains contextes, A::A signifie le
constructeur d'A. Seulement, la norme est on ne peut plus
imprécise sur ce sujet. Tout ce qu'elle dit, c'est :

Constructors do not have names. A special declarator
syntax using an optional sequence of function-specifiers
followed by the constructor's class name followed by a
parameter list is used to declare or define the
constructor.

Seulement, personne n'implémente ça tel qu'il est écrit ; pris
à la lettre, ça signifierait que :

class C { public : C() ; } ;

C() // Nom de la classe !!!
{
}

serait légal (or qu'aucun compilateur, à ma connaissance, ne
l'accepte). Je crois plutôt que c'est seulement quand le nom de
la classe apparaît dans la portée de la classe qu'il peut être
pris comme constructeur. Mais alors, encore... est-ce que ça
vaut partout ou non ? Et selon quels critères est-ce qu'il faut
décider si () est un « parameter list » ou un « argument
list » ?

Je crois que dans ce cas précis, la norme est assez claire :

mem-initializer-id:
::[opt] nested-name-specifier[opt] class-name

La seule interprétation permise par la grammaire, c'est que le
premier A, c'est un nested-name-specifier, et que le deuxième,
c'est un class-name. C'est donc légal. Mais la situation décrite
ci-dessus me semble assez vague que je ne critiquerais pas trop
un compilateur qui interprète A::A(... comme un essai de
déclarer un constructeur (ce qui n'est évidemment pas permis
ici).

Quote:
mais c'est
très certainement une incongruité.

C'est le moins que l'on puisse dire.
Pourquoi utiliser l'opérateur de résolution de portée dans

B(int a, int b): A::A(a,b) {};

Ca n'a pas de sens. Parce qu'il n'existe pas de constructeur virtuel alors
quand on écrit normalement

B(int a, int b): A(a,b) {};

on est sûr que c'est bien le constructeur de A qui est appelé.

C'est toujours le constructeur de A qu'on appelle. Ce n'est pas
lui qu'on nomme ; on nomme la classe de base.

Quote:
Est-ce une erreur ? la question serait plutôt, est-ce qu'en
programmation faire un pléonasme est une erreur ou pas ? Wink

Disons que c'est une erreur, dans le sens plus général. Même si
le langage le permet, ça déroute, et ça sème la confusion. Et
où je travaille, on considère le code qui déroute et qui sème la
confusion d'être en erreur aussi. Même si le compilateur ne le
rejette pas, la revue de code, elle, le rejettera.

--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
Alain Gaillard
Guest





PostPosted: Fri May 04, 2007 2:51 pm    Post subject: Re: Re: Héritage et constructeur Reply with quote

Quote:
on est sûr que c'est bien le constructeur de A qui est appelé.

C'est toujours le constructeur de A qu'on appelle. Ce n'est pas
lui qu'on nomme ; on nomme la classe de base.

Tout à fait.

Quote:
confusion d'être en erreur aussi. Même si le compilateur ne le
rejette pas, la revue de code, elle, le rejettera.

Je crois que nous sommes tous d'accord là dessus.


--
Alain
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.