C++ Possible de faire en sorte qu'un destructeur n'appelle PAS le destructeur des membres de la classe et le destructeur de la classe de base ?


AdyAdy

Existe-t-il un moyen de faire en sorte qu'un destructeur d'une classe n'appelle PAS le destructeur de l'un des membres de la classe et/ou n'appelle PAS le destructeur de sa classe de base ?

Si cela n'est pas possible, est-ce que créer certains membres de la classe avec un nouveau placement et les détruire (/non-destructer) manuellement est-il une solution de contournement possible ? Merci!

EDIT : La raison pour laquelle j'ai besoin de ça : la classe C possède l'objet M. M a un destructeur non trivial. C est ami de M et gère M de manière à ce qu'il n'y ait pas besoin d'appeler le destructeur de M. Il est correct de l'appeler, mais cela signifie une surcharge de performances. (c'est un problème dans ce cas.) Je pensais créer une classe dérivée de M qui a un destructeur qui ne fait rien, mais cela appellerait toujours le destructeur de la base.

Serge Ballesta

Au moment de la construction, C++ s'assure que les constructeurs des sous-classes sont d'abord appelés, puis les membres sont construits et enfin le constructeur approprié est appliqué. Au moment de la destruction la symétrie est faite.

Cela signifie que vous ne pouvez pas empêcher l'application d'un destructeur de classe de base, ni d'aucun constructeur membre, dès que l'objet est détruit . Si vous ne voulez en détruire que certains, vous devez trouver un moyen de ne pas détruire l'objet (utilisez simplement un pointeur brut...) et appeler manuellement les destructeurs sur ce que vous voulez. Mais vous ne voulez certainement pas faire ça !

C++ est très confiant sur les compétences du programmeur, il est donc facile d'écrire un programme invoquant un comportement indéfini. Si vous essayez de subvertir le compilateur C++ pour ne pas appeler le destructeur d'une classe de base ou d'un membre, vous avez un problème majeur. Le membre que vous ne voulez pas détruire ne doit pas être un membre mais plus probablement un pointeur (brut ou partagé) ou une référence à un objet externe qui aura sa propre gestion de durée de vie. Et la classe de base devrait probablement aussi être un pointeur ou une référence vers un objet externe, et là encore la durée de vie peut (et devrait) être gérée en dehors de la classe.

Articles connexes


Le destructeur de la classe enfant n'est pas appelé

Alexandre Je travaille actuellement sur un jeu en tant que projet pour mon université. Il est réalisé en C++ avec SDL2. J'ai un vecteur qui contient des pointeurs de la classe Enemies, qui est une classe parente abstraite de la Plantclasse. Dans le constructeu

Destructeur pour la classe de modèle

Reodont J'ai une classe de modèle. L'un des paramètres est soit char*ou std::string. Je dois donc supprimer char*et don t deletestd :: string`. Je n'ai aucune idée de ce que je dois faire. template <typename T> class Discipline { public: unsigned int getLe

Renvoyer le destructeur de classe

Ciprian Ambrus Je suis étudiant et j'apprends le C ++. Je suis assez bon en C ++, encore des choses «simples» m'empêtrent. J'ai récemment appris des classes, des méthodes, des constructeurs / déconstructeurs, des héritages, des virtuels, etc. J'ai ce code: #in