|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Étudiant Inscription : décembre 2012 Messages : 3 ![]() |
Bonjour,
J'ai commencé le C++ il y a peu et j'ai rencontré un petit problème en essayant d'appeler un constructeur en récursif : Code :
Code :
J'ai donc deux questions : -Pourquoi le 1e code ne compile pas ? -Pourquoi le second me renvoie un mauvais MU ? Merci d'avance ! |
||||
|
|
00
|
|
|
#2 | ||||||||
|
Expert Confirmé
![]() Pierre Ingénieur développement logiciels Inscription : juin 2007 Messages : 1 368 ![]() |
Un constructeur n'est jamais récursif.
L'appel d'un constructeur crée une valeur de ce type, même depuis le code d'un autre constructeur. Pour initier une valeur pendant la construction, la syntaxe est: Code :
Code :
Code :
Code :
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
|
||||||||
|
10
|
|
|
#3 |
|
Invité de passage
![]() Étudiant Inscription : décembre 2012 Messages : 3 ![]() |
Merci pour ta réponse !
Mon professeur m'a affirmé, pendant que je postais ce code sur le forum, qu'un appel à un constructeur en récursif était possible car c++ ne créait ainsi qu'un seul objet (il m'en a d'ailleurs fait plusieurs exemples concluants). Que se passe t-il lorsque l'on appelle un constructeur récursivement ? Y-a t-il des conditions à respecter si l'on veut appeler un constructeur en récursif ou est-ce à bannir définitivement ? |
|
|
00
|
|
|
#4 | |
![]() ![]() ![]() |
Citation:
Peux-tu nous montrer vos "exemples" ? Si tu fait : Tu va créer des objets temporaires qui seront détruits dès la fin de la ligne et je ne vois pas trop l'intérêt de faire ça à par tenter de rendre le code plus obscur. Si on veut créer plusieurs instances de C, on utilisera une factory.
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon. Chaîne Youtube : Vidéos Ma page DVP : http://neckara.developpez.com/ |
|
|
|
10
|
|
|
#5 |
|
Expert Confirmé
![]() Pierre Ingénieur développement logiciels Inscription : juin 2007 Messages : 1 368 ![]() |
Regarde toute la section constructeurs de la faq.
Il faut comprendre qu'un constructeur est constitué de plusieurs choses très distinctes, et que ce qu'on appellerai "constructeur récursif" est forcément impossible pour cette raison même. Supposons la classe suivante: Le constructeur aura la forme suivante: signature : construction {initialisation} c'est à dire S::s(int value) : m(value) {}La partie construction est un ensemble d'appels aux constructeurs de chaque membre, classe mère et classe virtuelle mère. Les types de bases utilisent la même notation, par exemple: m(2)Chaque membre ne peut être construit qu'une fois, ils sont construit dans l'ordre d'instanciation par la classe. (plus d'informations) Les membres non explicitement construits utilisent leur constructeur par défaut (pointeur et type de bases utilisent en théorie 0, mais mieux vaut les spécifier). La partie initialisation est appelée une fois l'objet construit. Elle permet de modifier l'objet pour le placer dans un état valide. Le constructeur ne peut pas appeler un constructeur récursivement, parce quand on voudrait le faire, l'objet est déjà construit, et on est en train de l'initialiser. Par contre, il existe des arguments par défaut, qui permettent de regrouper plusieurs constructeurs en un seul. Dans tous les cas, un appel au constructeur qui ne parvient pas à se terminer à cause d'une exception (d'où quelle vienne) provoque la désallocation immédiate de l'objet. Le destructeur de l'objet n'est pas appelé (puisqu'il n'est pas pleinement construit), par contre tout membre construit au moment de l'exception est bien détruit.
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
|
|
00
|
|
|
#6 |
![]() ![]() Loïc JolyDéveloppeur informatique Inscription : août 2004 Messages : 4 699 ![]() |
A noter qu'il est possible en C++11 qu'un constructeur en appelle un autre (c'est connu sous le nom de delegating constructors), mais ça ne permet en aucun cas des appels récursifs.
__________________
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11. |
|
|
00
|
|
|
#7 | ||
|
Membre du Club
![]() Inscription : juin 2008 Messages : 121 ![]() |
Récursif est-il le bon terme ?
Ne cherches-tu pas plutôt à faire ceci : Code :
|
||
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Étudiant Inscription : décembre 2012 Messages : 3 ![]() |
Neckara, je n'ai plus ces exemples en tête, je redemanderai à mon prof demain si je le vois.
leternel, merci pour toutes ces informations sur les constructeurs, je lirai plus attentivement la FAQ sur le sujet. Ce que j'en conclus d'important, c'est qu'ils vaut mieux faire les opérations délicates hors du constructeur. MicBeast, oui la question portait sur le récursif. Je n'aurai eu aucun mal à faire un programme qui fonctionne, j'étais simplement curieux de savoir en quoi il ne fonctionnait pas. |
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() ![]() Inscription : août 2006 Messages : 3 433 ![]() |
Koa,
À mon avis, vouloir faire un constructeur récursif montre une profonde méconnaissance de ce qu'est un constructeur, et si c'est un prof qui a suggéré ça, il faut en changer immédiatement (je sais, je sais : tu n'as pas pas le choix
__________________
Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir. |
|
|
00
|
|
|
#10 |
![]() ![]() Cyrille Network programmer Inscription : juin 2010 Messages : 1 570 ![]() |
Bonjour,
le seul moment où tu fais un appel explicite au constructeur c'est dans le cas d'un héritage où la classe mère a un constructeur avec paramètres. Sinon, tu n'as pas à te soucier d'appeler le constructeur, c'est automatique à la création d'un objet. |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com