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 

empecher un constructeur de ...construire

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





PostPosted: Fri Feb 13, 2004 6:45 pm    Post subject: empecher un constructeur de ...construire Reply with quote



salut,

j'ai un constructeur prenant un paramètre, est-il possible dans le
corps du constructeur de tester le paramètre et de faire échouer la
construction de l'objet après le test ? ou doit-on se contenter de
tester le paramètre avant d'appeler de constructeur (ce qui n'est pas
top du tout)

je pense aux exceptions... mais bon...

--
Nico,
http://astrosurf.com/nicoastro
messenger : [email]nicolas_aunai (AT) hotmail (DOT) com[/email]

Back to top
Drakkhen
Guest





PostPosted: Fri Feb 13, 2004 7:19 pm    Post subject: Re: empecher un constructeur de ...construire Reply with quote



throw...


Back to top
Alexandre
Guest





PostPosted: Fri Feb 13, 2004 7:46 pm    Post subject: Re: empecher un constructeur de ...construire Reply with quote




"Nicolas Aunai" <nicolas.aunai (AT) free (DOT) fr> a écrit dans le message de
news:mesnews.6ca17d42.00ff7bdd.125.1437 (AT) free (DOT) fr...
Quote:
salut,

j'ai un constructeur prenant un paramètre, est-il possible dans le
corps du constructeur de tester le paramètre et de faire échouer la
construction de l'objet après le test ? ou doit-on se contenter de
tester le paramètre avant d'appeler de constructeur (ce qui n'est pas
top du tout)

je pense aux exceptions... mais bon...

ben oui je vois pas trop quoi faire d'autre. Si une exception est lancée
dans un constructeur, l'objet n'est je crois pas construit.

MonObj::MonObj(Mon Par)
{
if( MonPar est pas bon)
throw UneExceptionAMoiQueJAime;
ContinueAConstruire();
}

Quote:

--
Nico,
http://astrosurf.com/nicoastro
messenger : [email]nicolas_aunai (AT) hotmail (DOT) com[/email]




Back to top
Patrick Mézard
Guest





PostPosted: Sat Feb 14, 2004 9:05 am    Post subject: Re: empecher un constructeur de ...construire Reply with quote

Quote:
j'ai un constructeur prenant un paramètre, est-il possible dans le
corps du constructeur de tester le paramètre et de faire échouer la
construction de l'objet après le test ? ou doit-on se contenter de
tester le paramètre avant d'appeler de constructeur (ce qui n'est pas
top du tout)

je pense aux exceptions... mais bon...

Exactement.
http://www.gotw.ca/gotw/066.htm ("Constructor Failures") est intéressant à
ce sujet.

Patrick Mézard



Back to top
Nicolas Aunai
Guest





PostPosted: Sat Feb 14, 2004 5:02 pm    Post subject: Re: empecher un constructeur de ...construire Reply with quote

Patrick Mézard avait écrit le 14/02/2004 :


Quote:
Exactement.
http://www.gotw.ca/gotw/066.htm ("Constructor Failures") est intéressant à
ce sujet.


ok merci des renseignements.

concernant les exceptions, lorsqu'on fait un projet, à quel moment
doit-on commencer la réflexion sur les classes d'exceptions, leur
hierarchie, organisation etc... doit-on s'en préoccuper dès l'étape de
conception, pendant le codage a proprement parler, ou plutot une fois
que tout est fait, on s'occupe de la gestion des exceptions ?

--
Nico,
http://astrosurf.com/nicoastro
messenger : [email]nicolas_aunai (AT) hotmail (DOT) com[/email]


Back to top
Matthieu Moy
Guest





PostPosted: Sat Feb 14, 2004 6:26 pm    Post subject: Re: empecher un constructeur de ...construire Reply with quote

Nicolas Aunai <nicolas.aunai (AT) free (DOT) fr> writes:

Quote:
salut,

j'ai un constructeur prenant un paramètre, est-il possible dans le
corps du constructeur de tester le paramètre et de faire échouer la
construction de l'objet après le test ?

Moi, je ferais une fonction statique que tu appelles à la place du
constructeur, qui renvoit un objet de ta classe, et qui ne fait le
"new" que si le test réussi.

Parce que si tu le fait dans le constructeur, le "malloc" est déjà
fait, c'est moins efficace.

--
Matthieu

Back to top
Patrick Mézard
Guest





PostPosted: Sat Feb 14, 2004 8:33 pm    Post subject: Re: empecher un constructeur de ...construire Reply with quote

Quote:
salut,

j'ai un constructeur prenant un paramètre, est-il possible dans le
corps du constructeur de tester le paramètre et de faire échouer la
construction de l'objet après le test ?

Moi, je ferais une fonction statique que tu appelles à la place du
constructeur, qui renvoit un objet de ta classe, et qui ne fait le
"new" que si le test réussi.

De quel new parles-tu ?
Comment ferais-tu lorsque l'objet n'est pas instancié dynamiquement comme là
:

struct array
{
array(int size)
{
if(size<0)
throw std::invalid_argument("Size must be positive");
[...]
//Alloue le tableau et fait des trucs
}

[...]
}

int main()
{
array a(-1);
}

Quote:
Parce que si tu le fait dans le constructeur, le "malloc" est déjà
fait, c'est moins efficace.

De quel malloc parles-tu ?

Patrick Mézard



Back to top
Patrick Mézard
Guest





PostPosted: Sat Feb 14, 2004 8:53 pm    Post subject: Re: empecher un constructeur de ...construire Reply with quote


Quote:
Exactement.
http://www.gotw.ca/gotw/066.htm ("Constructor Failures") est intéressant
à
ce sujet.


ok merci des renseignements.

concernant les exceptions, lorsqu'on fait un projet, à quel moment
doit-on commencer la réflexion sur les classes d'exceptions, leur
hierarchie, organisation etc... doit-on s'en préoccuper dès l'étape de
conception, pendant le codage a proprement parler, ou plutot une fois
que tout est fait, on s'occupe de la gestion des exceptions ?

Ca dépend de ce que tu entends par "gestion des exceptions".
A partir du moment où tu admets que ton code va voir passer des exceptions,
il vaut mieux en tenir compte partout, ça évite les mauvaises surprises. Ca
veut dire de gèrer les ressources correctement avec de la RAII, d'établir et
de conserver tes invariants d'objets même et surtout en cas d'exceptions,
etc...

En ce qui concerne la manière d'organiser et de gèrer tes exceptions, c'est
au cas par cas. Dans le cas d'une bibliothèque très spécialisée (compression
d'image par exemple) on peut imaginer qu'une seule classe d'exception
contenant un code d'erreur soit suffisante, car le traitement de l'exception
sera lui aussi sommaire (est-ce que j'ai réussi à compresser ou pas, si non,
pourquoi, et ça s'arrête là). Maintenant, si les traitements sont plus
complexes, la hiérarchie d'exceptions sera à leur image. Mais dans ce cas,
cette hiérarchie se dessinera d'elle-même avec le reste du code, vu qu'elle
apportera des fonctionnalités au même titre que les autres classes. La
gestion d'erreur n'est pas quelque chose d'anodin, en marge du processus de
développement. Il me parait difficile de s'en occuper a posteriori.

Patrick Mézard



Back to top
Vladimir
Guest





PostPosted: Sat Feb 14, 2004 9:06 pm    Post subject: Re: empecher un constructeur de ...construire Reply with quote


Quote:
j'ai un constructeur prenant un paramètre, est-il possible dans le
corps du constructeur de tester le paramètre et de faire échouer la
construction de l'objet après le test ? ou doit-on se contenter de
tester le paramètre avant d'appeler de constructeur (ce qui n'est pas
top du tout)

je pense aux exceptions... mais bon...

Le plus élégant serait de lancer une exception lors de la construction,

sinon une autre solution est de faire un delete this ( c'est pas très
élégant, mais ça peut parfaitement convenir dans certain cas .... )



Back to top
Matthieu Moy
Guest





PostPosted: Sun Feb 15, 2004 6:03 pm    Post subject: Re: empecher un constructeur de ...construire Reply with quote

"Patrick Mézard" <patrick.mezard (AT) ifrance (DOT) com> writes:

Quote:
De quel new parles-tu ?

Du "new" que tu fais si tu alloue l'objet dynamiquement.

Quote:
Comment ferais-tu lorsque l'objet n'est pas instancié dynamiquement comme là

[...]

Quote:
int main() {
array a(-1);
}

En effet, dans ce cas là, tu ne peux pas passer à coté de l'appel du
constructeur. Mais à ce moment là, je ne vois pas trop quelle
sémantique on peut donner à « faire échouer la construction de
l'objet ». Si tu peux écrire

array a(-1);
b = a;

Alors, quelle est la sémantique de « b = a » ?

Effectivement, avec des exceptions, on s'en sort, puisque la ligne « b
= a » n'est plus atteignable, mais à ce moment, c'est plus que la
création de l'objet qui échoue, c'est carrément tout le bloc
d'instruction qui utilise l'objet. (Mais ça répond peut être à la
question, je ne dis pas le contraire)

Reste à voir ce que voulais exactement le posteur original ...

--
Matthieu

Back to top
Patrick Mézard
Guest





PostPosted: Sun Feb 15, 2004 8:50 pm    Post subject: Re: empecher un constructeur de ...construire Reply with quote

Quote:
int main() {
array a(-1);
}

En effet, dans ce cas là, tu ne peux pas passer à coté de l'appel du
constructeur. Mais à ce moment là, je ne vois pas trop quelle
sémantique on peut donner à « faire échouer la construction de
l'objet ».

C'est exactement le sujet du "Guru of the Week" cité dans ma première
réponse : un objet non construit n'existe pas, donc on ne peut pas
l'utiliser. C'est pourquoi le fameux idiome du "constructeur + init()"
dénoncé par Stroustrup dans TCPPL est moins robuste que l'utilisation
d'exceptions pour signaler des échecs de constructions.

Quote:
Si tu peux écrire

array a(-1);
b = a;

Alors, quelle est la sémantique de « b = a » ?

Aucune. Cette instruction n'a de sens que si "a" est valide (ie. les
invariants d'objets sont valides). En cas d'échec à la construction de "a",
il ne peuvent l'être par définition.

Quote:

Effectivement, avec des exceptions, on s'en sort, puisque la ligne « b
= a » n'est plus atteignable, mais à ce moment, c'est plus que la
création de l'objet qui échoue, c'est carrément tout le bloc
d'instruction qui utilise l'objet. (Mais ça répond peut être à la
question, je ne dis pas le contraire)

Reste à voir ce que voulais exactement le posteur original ...

Disons que je ne vois pas d'autre alternative. La technique du genre
"j'instancie une version incomplète mais destructible de l'objet, puis je
tente de l'initialiser et fait un return en cas d'échec" n'est pas
fondamentalement différente d'une levée d'exception. Elle est juste plus
complexe et plus fragile.

Patrick Mézard



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.