Le destructeur de classe interne est appelé après le destructeur de classe de base


Coda

J'ai une question basique et simple.

J'ai ce scénario:

#include <iostream>
using namespace std;

class Inner1
{
public:
    ~Inner1() {cout << "Inner1 Des\n";};
};

class Inner2
{
public:
    ~Inner2() {cout << "Inner2 Des\n";};
};

class Base
{
public:
    ~Base() {cout << "Base Des\n";};

    Inner1 inner1;
    Inner2 inner2;
};

int main() {
    Base base;
    return 0;
}

Et ma console me dit maintenant ceci:

Destructeur de base appelé
destructeur
Inner2 appelé destructeur Inner1 appelé

Est-ce le comportement normal? Parce que la fonctionnalité de certaines fonctions
est déjà détruite dans mon destructeur de classe de base et que les classes internes en dépendent.

Solution de contournement non recommandée:

Ajoutez simplement une classe "Destroyer" avec un objet à la première position:

[...]
class Base
    {
    public:
        ~Base() {cout << "Base Des\n";};

        class Destroyer
        {
             ~Destroyer()
             {
                 //Put the stuff here because this destr will be called last
                 cout << "Destroyer Des\n";
             }
        } _destroyer;
        Inner1 inner1;
[...]

Merci de votre aide

Eerorika

Est-ce le comportement normal?

Oui. Les destructeurs de sous-objets sont appelés par le destructeur de la classe conteneur. En particulier, les sous-objets seront détruits après l'exécution du corps du destructeur de classes de conteneurs.

Parce que la fonctionnalité de certaines fonctions est déjà détruite dans mon destructeur de classe de base et que les classes internes en dépendent.

Ce n'est un problème que si les destructeurs de classes internes [sic] dépendent de l' Baseinstance qui les contient. Dans ce cas, soit Basene doivent pas les contenir en tant que membres, soit leur destructeur ne doit pas dépendre de Base.

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

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

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