PDA

Voir la version complète : Constructeur explicite vide.


Ceacy
08/08/2005, 01h53
Bonsoir (ou plutôt bon matin ;)),
Je suis tombé plusieurs fois sur une syntaxe particulière, et j'aimerais bien savoir à quoi elle sert :
class MaClasse
{
public:
explicit MaClasse();
};

Autant je comprends l'intérêt du mot-clé "explicit" pour éviter les conversions implicites des paramètres, autant là, je m'interroge : ça sert à quoi ?

NewbiZ
08/08/2005, 02h18
Hum, en l'occurence je dirais que c'est purement pour la forme.
C'est une habitude à prendre que de coder un constructeur et un destructeur pour chaque classe.
Mais c'est vrai que généralement le explicit sert à une plus grande clarté lors de l'appel a un constructeur qui prend un paramètre, comme :
class MaClasse {
public:
explicit MaClasse(int);
};
pour éviter un
MaClasse Bidule = 10;
qui pourrait porter à confusion.

Flamaros
08/08/2005, 02h43
A mon sens il ne peux y avoir confusion que si on s'amuse a declarer des variables en plein milieux d'une fonction.
Quand on fait les declarations au debut c'est pas vraiment un probleme puisqu'on c'est que ce sont des declarations (dont on marque la fin avec un saut de ligne).

NewbiZ
08/08/2005, 04h14
Ben si tu sépares bien déclarations et initialisations ca n'induit pas en erreur, non. Mais le C n'est pas le pascal, on peut déclarer n'importe où ...
Donc il est considéré comme plus "propre" de forcer l'usager à utiliser
MaClasse Bidule(10);
plutot que
MaClasse Bidule = 10;
Après c'est une spécificité comme une autre on va pas tout remettre en question :)

Flamaros
08/08/2005, 06h15
En C tu ne peux pas normalement declarer tes variables n'importe ou dans ta fonction, en C++ oui.
J'ai tente le coup mais gcc n'aime pas, a moins que ce soit les options de compilation que je mets dans le MAKEFILE.

Loulou
08/08/2005, 08h50
A priori, déclarer un constructeur par défaut explicite n'a aucun sens. Où as-tu vu ce genre de syntaxe ?

Ceacy
08/08/2005, 09h41
Ici (http://www.mcshaffry.com/GameCode/thread.php?threadid=507&sid=), par exemple, dans la classe IEventFactorPtr (et notamment dans les codes sources de Game Coding Complete)

Acetate
08/08/2005, 10h47
En C ANSI (ou ISO 89, je ne suis pas très au fait des normes..), toutes les variables doivent être déclarées en tête de bloc, y compris les compteurs de boucles dont les déclarations dans l'initialisation du for( ; ; ) sont interdites.

En revanche en C++ le compilo ne me crie pas dessus (toutefois je n'ai pas essayé avec -pedantic).

Loulou
08/08/2005, 10h58
Ici (http://www.mcshaffry.com/GameCode/thread.php?threadid=507&sid=), par exemple, dans la classe IEventFactorPtr (et notamment dans les codes sources de Game Coding Complete)
Peut-être simplement une convention de coding ? En tout cas tu peux essayer de mailer l'auteur pour lui demander, au moins la réponse sera claire.

Eva
08/08/2005, 13h41
En C ANSI (ou ISO 89, je ne suis pas très au fait des normes..), toutes les variables doivent être déclarées en tête de bloc, y compris les compteurs de boucles dont les déclarations dans l'initialisation du for( ; ; ) sont interdites.

En revanche en C++ le compilo ne me crie pas dessus (toutefois je n'ai pas essayé avec -pedantic).
En C, on a le droit de déclarer dans un for.
Et en C, on peut aussi déclarer n'importe où, si on aime voir des accolades n'importe où, évidemment...

Bahamut
08/08/2005, 14h18
C'est faux à moitié Eva.

En C non ANSI, tu as raison.

Parcontre, En C ANSI avec un compilo C qui respecte cette norme (compilateur Cygwin par ex), tu n'as pas le droit de déclarer des variables en plein milieu de bloc ou bien dans un for.

Essayes et tu verras ;)

Eva
08/08/2005, 14h45
Me semblait qu'on pouvait faire for(<T>...;;) en C ANSI. Enfin, un prof de l'INSIA m'a confirmé ça il y a quelques mois...

Par contre, je maintiens ce que j'ai dit concernant "faire des déclarations n'importe où du moment qu'on aime les accolades" :

int fonction(...){
int....;
//instructions
{
int...;
//instructions
{
int...;
etc....
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
Mais bon, faut aimer les accolades :P

Bahamut
08/08/2005, 15h49
Ton prof devra alors revoir son cours ^^

Je t'invite à essayer par toi même avec un compilo ANSI.

Flamaros
08/08/2005, 17h24
Perso les accolades comme tu dis Eva c'est porcs.

J'en utilise juste pour separer les blocs en OpenGL (entre glbgin et glend par ex), ca aide a la lecture et emacs en plus rajoute une indentation.

PS : Je compile la C avec -Wall - pedantic -ainsi -perror -W (si je ne me trompe pas)
Impossible de compiler avec des warnings (chiant quand on a pas l'habitude).

Lightness1024!
08/08/2005, 22h04
de toute facon de nos jours tous les compilateurs acceptent les déclarations n'importe ou.
car cela figure non seulement dans les extensions GNU depuis un bon moment, mais aussi dans la vraie norme ISO/IEC/ANSI C99.

Bahamut
09/08/2005, 14h17
Faux...pas tous.

En milieu industriel, tous les développeurs sont loin d'utiliser la boite à outil Visual C++ pour une raison ou une autre.

Je connais plus d'un projet qui utilisent encore des compilateurs C AINSI qui sont incompatibles avec des déclarations éparpillées dont un outil que j'ai l'occasion de me servir.

Lightness1024!
09/08/2005, 19h24
eh bien tes compilateurs datent des années 80.
un compilateur a la norme en tout cas doit les accepter.
ou bien un compilateur GNU.

Bahamut
10/08/2005, 09h04
Ce fameux outil que j'utilise est en fait un outil de simulation qui est actuellement utilisé dans le domaine de l'aviation civile sur un petit projet de plus de 400 M¤... dont plus de 4M¤ juste pour la cellule dont j'ai la gestion. Vu la somme, tu imagines qu'il ne s'agit pas que d'un simple outil datant des années 80.

De plus, une chôse à savoir, c'est qu'en milieu professionnel, on ne choisi pas ses propres outils, son compilo, et surtout sa plateforme de dév (Windows/Linux). On te l'impose (la boite...le chef de projet...) et que tu le veuilles....ou que tu le veuilles pas. Par la suite, avec un peu de responsabilité , tu pourras choisir (c'est le rôle d'un responsable d'équipe).

En milieu industriel, on est amené à utiliser des outils déjà conçus pour les ré-utiliser (on ré-invente jamais la roue car gain de temps = gain d'argent...car salaire 1 ingé/jour > c'est un cout minimum de 300¤/jour pour un client).

Le compilo utilisé par l'outil : http://www.cygwin.com/

De tête, je ne sais plus quelle version possède l'outil puisque je n'ai que très peu l'occasion de compiler avec mais je peux te garantir que le compilo respecte la NORME ANSI C pour laquelle la déclarion des variables est restreintes...testé et certifié.

Etant développeur C++, je ne suis pas du tout un spécialiste du C et encore de ses Normes mais je peux te certifier (tests à l'appui réalisés par des collègues et moi même) qu'on ne peux pas déclarer des variables au milieu de blocs d'instructions (à moins d'utiliser un superfuge comme les {}).

ganlhi
10/08/2005, 09h28
Lightness1024! > Pas d'accord avec toi... Prenons un exemple mondialement reconnu : GCC. Si tu compiles sans options, il acceptera les déclarations éparpillées... Mais si tu lui demande de suivre la norme ANSI, justement, il t'enverra bouler si tu n'as pas rassemblé tes déclarations. Conclusions : les déclarations éparpillées sont tolérées, mais interdites dans la norme ANSI !

Loulou
10/08/2005, 10h14
Pour mettre fin au débat : le C99 autorise bien la déclaration de variables n'importe où, c'est dans la norme. Après, il y a des compilos qui implémentent plus ou moins cette norme ; parfois cela marchera, parfois non.

En ce qui concerne gcc (utilisé par cygwin, qui au passage n'est pas un compilo mais simplement un environnement Linux pour Windows), il supporte cette fonctionalité au moins depuis sa version 3.0.

ganlhi
10/08/2005, 10h27
Oui, il la supporte, mais personnellement je compile en mode "strict" (option -ansi) et dans ce cas, il dit "c'est pas bien !"

Bahamut
10/08/2005, 11h19
On possede une version de cygwin de 1999...donc peut etre une version 2.x et non une version 3.x. je n'ai pas vraiment eu le tps de trouver la version sous peine d'embeter mon collegue.

Au passage, Cygwin est tout de même plus ou moins un compilo...ou du moins c'est gcc émulé sous windows ;)

Loulou
10/08/2005, 12h25
Non non, Cygwin est vraiment un environnement "complet" Linux (pas que gcc), le portage de gcc étant lui MinGW, pour être précis. Y a qu'à regarder la description se trouvant sur la page que tu as donné en lien précédemment pour s'en convaincre.

S'il date de 1999, alors il serait normal qu'il n'implémente pas les fonctionnalités de la norme sortie cette même année :)

Lightness1024!
10/08/2005, 15h39
toutafé.

je ne suis peut etre pas encore ingénieur (encore 2 ans hehe)
mais je suis quand même au courant des normes :)