Question

Étant donné l'exemple de code:

class B {
    //Some contents.
};

class C {
    private:
        B& b;
};

class A {
    private:
        B b;
        C c;
};

Classe C a une référence à un b, donc il doit être initialisé avec elle. Classe A contient une instance de B et une instance de C.

Ma question est: Puis-je initialiser l'instance de C en A avec l'instance B en A (en supposant que je ne pris la peine de mettre les constructeurs en)? En second lieu, dois-je effectuer une initialisation explicite du B en A, ou est-il default initialisés depuis son type de classe dans une classe?

Était-ce utile?

La solution

les variables membres sont initialisés dans l'ordre qu'ils sont déclarés, alors oui, au moment de la déclaration de classe ( même si vous les avez dans un ordre différent dans la liste d'initialisation du constructeur ) c est initialisés, b sera initialisés, et vous pouvez utiliser b pour initialiser c.

Ricardo notes Cardenes, il fonctionne toujours, même si vous déclarez c avant b dans la définition de la classe (ce qui signifie que vous passerez C::C une référence à un B uninitialised) vous cause cependant un comportement non défini si vous utiliser l'objet à l'intérieur C::C. Il est plus sûr de déclarer b d'abord, parce que même si vous ne pouvez pas utiliser b l'intérieur C::C maintenant, vous pourriez à l'avenir et oublier que la référence se réfère à un B uninitialised, et la cause UB.

Et non, vous n'avez pas explicitement b Initialiser (à moins qu'il soit POD ) à moins que vous ne voulez pas qu'il soit construit par défaut. Donc, ce code serait ce que vous voulez (encore une fois, si B n'est pas POD):

A::A() : c(b) { }

Autres conseils

Pour votre première question: vous pouvez l'initialiser en écrivant des constructeurs comme ceci:

C::C(B& bInst): b(bInst){}
A::A():b(), c(b) {}

Bien sûr, si votre constructeur de C utilise en fait b (au lieu de simplement son adresse), vous devez vous assurer que l'ordre d'initialisation reste le même, donc b doit être déclarée avant c, puisque les membres sont initialisés dans l'ordre où ils sont déclarée (même si la liste des initializaiton les met dans un ordre différent).

Et non vous n'avez pas besoin explicitement initialize B, car il sera construit par défaut si vous ne le faites pas. Bien sûr, si B est un POD ce moyen reste il initialisés (tout en initialisant utilisant explicitement b() dans la liste initialiseur de A() serait l'initialiser à 0).

Puis-je initialiser l'instance de C en A avec l'instance B en A (en supposant que je ne la peine de mettre les constructeurs en)

Bien sûr.

En second lieu, dois-je effectuer une initialisation explicite du B en A, ou est-il default initialisés depuis son type de classe dans une classe?

Non, c'est très bien.

Oui, puisque C ne contient qu'une référence à un B et non une instance distincte, vous pouvez mettre un constructeur en C et laisser A.b de référence A.C.b.

B et C à l'intérieur de A sont tous les deux instanciés / construits automatiquement lors de la création d'une instance de A.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top