4 votes

Comment initialiser les variables membres avant les classes héritées ?

J'essaie de créer une classe qui exige que les variables membres soient d'abord initialisées. Je sais pourquoi cela se produit, mais y a-t-il un moyen de contourner ce problème ?

Ordre d'impression actuel : deuxième premier

Commande d'impression souhaitée : premier deuxième

#include <iostream>

struct A {
    A() {
        std::cout << "first" << '\n';
    }
};

struct B {
    B() {
        std::cout << "second" << '\n';
    }
};

struct C : public B {

    C() : a(), B() {

    }

    A a;

};

int main() {

    C c;

    return 0;
}

6voto

molbdnilo Points 9289

Placez les membres qui doivent être initialisés en premier lieu dans une structure et héritez-en de manière privée, avant de les placer dans une structure. B .

struct A {
    A() { std::cout << "first" << '\n'; }
};

struct B {
    B() { std::cout << "second" << '\n'; }
};

struct Members { A a; };

struct C : private Members, public B {
    C() : Members(), B() {}
};

int main() {
    C c;
} 

L'inconvénient est qu'il n'y a aucun moyen d'éviter d'exposer la "structure membre" au monde extérieur, mais cela ne devrait pas poser de problème dans la pratique.

4voto

AndyG Points 3298

En C++, les classes de base sont initialisées avant les variables membres d'une classe dérivée.

Le meilleur recours, compte tenu des informations que vous avez fournies, est de préférer la composition à l'héritage :

struct A {
    A() {
        std::cout << "first" << '\n';
    }
};

struct B {
    B() {
        std::cout << "second" << '\n';
    }
};

struct C {
    A a;
    B b;
};

Cela permet d'afficher le comportement souhaité

-2voto

RoQuOTriX Points 1057

Faire A une référence nécessaire pour C :

#include <iostream>

struct A {
    A() {
        std::cout << "first" << '\n';
    }
};

struct B {
    B() {
        std::cout << "second" << '\n';
    }
};

struct C : public B {
    C(const A& a) : _A(a), B() {}
    const A& _A;
};

int main() {
    A a;
    C c(a);
    return 0;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X