Frage

Angesichts des Code -Beispiels:

class B {
    //Some contents.
};

class C {
    private:
        B& b;
};

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

Klasse C hat einen Hinweis auf AB, daher muss es damit initialisiert werden. Klasse A enthält eine Instanz von B und eine Instanz von C.

Meine Frage lautet: Kann ich die C -Instanz in A mit der B -Instanz in A initialisieren (vorausgesetzt, ich habe die Mühe gemacht, die Konstrukteure einzulegen)? Muss ich zweitens eine explizite Initialisierung des B in A durchführen, oder wird es standardmäßig initialisiert, da er innerhalb einer Klasse ein Klassentyp ist?

War es hilfreich?

Lösung

Mitgliedervariablen werden in der Reihenfolge initialisiert, dass sie in der Klassenerklärung deklariert werden (Auch wenn Sie sie in einer anderen Reihenfolge in der Initialisierungsliste des Konstruktors haben), also ja, zu der Zeit c wird initialisiert, b wird initialisiert und Sie können verwenden b zu initialisieren c.

Wie Ricardo Cardenes feststellt, funktioniert es auch, wenn Sie deklarieren c Vor b in der Klassendefinition (was bedeutet, dass Sie bestehen C::C Ein Hinweis auf eine nicht initialisierte B) Wie auch immer Sie undefiniertes Verhalten verursachen, wenn Sie verwenden das Objekt im Inneren C::C. Es ist sicherer zu erklären b Erstens, denn obwohl Sie möglicherweise nicht verwenden b Innerhalb C::C Jetzt könnten Sie in der Zukunft und vergessen, dass sich die Referenz auf eine nicht initialisierte bezieht B, und ub.

Und nein, Sie müssen nicht explizit initialisieren b (es sei denn, es ist Pod) Es sei denn, Sie möchten nicht, dass es standardmäßig konstruiert wird. Dieser Code wäre also das, was Sie wollen (erneut, wenn B ist nicht schote):

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

Andere Tipps

Zu Ihrer ersten Frage: Sie können es initialisieren, indem Sie solche Konstruktoren schreiben:

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

Natürlich, wenn Ihr Konstruktor von C tatsächlich verwendet b (statt nur der Adresse) müssen Sie sicherstellen, dass die Initialisierungsreihenfolge gleich bleibt, also b muss vorher deklariert werden c, Da die Mitglieder in der Reihenfolge initialisiert werden, in der sie deklariert sind (auch wenn die Initializaiton -Liste sie in eine andere Reihenfolge versetzt).

Und nein, Sie müssen B nicht explizit initialisieren, da es standardmäßig konstruiert wird, wenn Sie dies nicht tun. Natürlich, wenn B eine POD ist, bedeutet dies natürlich, dass sie nicht initialisiert bleibt (während sie sie mit der expliziten Initialisierung verwendet b() in der Initialisierliste von A() würde es initialisieren, um 0).

Kann ich die C -Instanz in A mit der B -Instanz in A initialisieren?

Sicher.

Muss ich zweitens eine explizite Initialisierung des B in A durchführen, oder wird es standardmäßig initialisiert, da er innerhalb einer Klasse ein Klassentyp ist?

Nein. Das ist in Ordnung.

Ja, da C nur einen Verweis auf ein B und keine separate Instanz enthält, können Sie einen Konstruktor in C einfügen und ACB referenzieren lassen

B und C in A werden automatisch instanziiert/konstruiert, wenn Sie eine Instanz von A. erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top