„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie gehe ich mit zirkulären Abhängigkeiten zwischen Headern in C++ um?

Wie gehe ich mit zirkulären Abhängigkeiten zwischen Headern in C++ um?

Veröffentlicht am 12.11.2024
Durchsuche:586

 How to Handle Circular Dependencies Between Headers in C  ?

Kopfzeilen, die einander einschließen

In C ist es gelegentlich notwendig, dass Kopfzeilen einander einschließen. Dies kann jedoch zu Problemen führen, insbesondere wenn es darum geht, wo die #include-Anweisungen platziert werden sollen.

Innerhalb oder außerhalb von Makros

Im Allgemeinen sollten #include-Anweisungen dies tun in Makros eingefügt werden, z. B. #ifndef, einschließlich Wachen. Dies verhindert eine unendliche Rekursion während der Kompilierung, wie im folgenden Beispiel gezeigt:

// A.h
#ifndef A_H_
#define A_H_

#include "B.h"

class A {
    private:
        B b;
    public:
        A() : b(*this) {}
};

#endif // A_H_
// B.h
#ifndef B_H_
#define B_H_

#include "A.h"

class B {
    private:
        A& a;
    public:
        B(A& a) : a(a) {}
};

#endif // B_H_

Das Platzieren der #include-Anweisungen außerhalb der Makros führt dazu, dass der Compiler aufgrund der gegenseitigen Einbeziehung zwischen A.h und B.h.

Nicht deklarierte Typen

Das Platzieren der #include-Anweisungen innerhalb der Makros kann jedoch zu Problemen mit führen nicht deklarierte Typen. Betrachten Sie beispielsweise den folgenden Code:

// A.h
#ifndef A_H_
#define A_H_

class A;  // Forward declaration

#include "B.h"

class A {
    private:
        B b;
    public:
        A() : b(*this) {}
};

#endif // A_H_
// B.h
#ifndef B_H_
#define B_H_

#include "A.h"

class B {
    private:
        A a;  // Directly include A
    public:
        B(A& a) : a(a) {}
};

#endif // B_H_

In diesem Fall beschwert sich der Compiler, dass A ein nicht deklarierter Typ innerhalb von B.h ist. Dies liegt daran, dass die Forward-Deklaration in A.h nicht sichtbar ist, wenn B.h enthalten ist.

Lösung: Forward-Deklarationen

Um diese Probleme zu lösen, ist es am besten, Forward-Deklarationen zu verwenden und fügen Sie bei Bedarf den Header mit der vollständigen Definition ein. In diesem Beispiel sollte eine Vorwärtsdeklaration von A zu B.h vor der Definition von B hinzugefügt werden:

// B.h
#ifndef B_H_
#define B_H_

class A;  // Forward declaration

#include "A.h"

class B {
    private:
        A a;  // Directly include A
    public:
        B(A& a) : a(a) {}
};

#endif // B_H_
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3