Heim >Backend-Entwicklung >C++ >C++-Syntaxfehler: Klassenmitglieder müssen vollständige Typen sein, wie gehe ich damit um?

C++-Syntaxfehler: Klassenmitglieder müssen vollständige Typen sein, wie gehe ich damit um?

WBOY
WBOYOriginal
2023-08-22 12:09:291204Durchsuche

C++-Syntaxfehler: Klassenmitglieder müssen vollständige Typen sein, wie gehe ich damit um?

Bei der C++-Programmierung können Programme aufgrund einiger einfacher Fehler häufig nicht korrekt kompiliert werden. Einer der häufigsten Fehler besteht darin, dass Klassenmitglieder vollständige Typen sein müssen. Diese Fehlermeldung weist darauf hin, dass beim Definieren einer Klassenmitgliedsvariablen oder einer Mitgliedsfunktion der verwendete Datentyp kein vollständiger Typ ist, was dazu führt, dass der Compiler den Datentyp des Klassenmitglieds nicht erkennen kann.

Diese Art von Fehler kann bei Querverweisen zwischen Klassen auftreten. Beispielsweise muss Klasse A auf Klasse B verweisen, aber Klasse B wurde vor der Deklaration von Klasse A nicht definiert. Zu diesem Zeitpunkt kann dieser Fehler auftreten, wenn die in Klasse A definierten Mitgliedsvariablen oder Mitgliedsfunktionen Klasse B betreffen.

Wie soll mit diesem Fehler umgegangen werden? Im Folgenden werde ich zwei mögliche Lösungen anbieten:

Methode 1: Vordeklarierte Klasse

Diese Methode ist eine relativ einfache und effektive Lösung. Bei der Definition von Klasse A kann Klasse B vorab außerhalb der Klasse deklariert werden. Auf diese Weise kann der Compiler diesen Typ erkennen, wenn Klasse B in Klasse A verwendet wird. Die Code-Implementierung lautet wie folgt:

class B; //提前声明类B

class A {
    private:
        B* b_ptr;
    public:
        void foo();
};

class B {
    private:
        int b_var;
    public:
        void bar();
};

void A::foo() {
    b_ptr = new B;
}

void B::bar() {
    b_var = 10;
}

int main() {
    A a_obj;
    a_obj.foo();
    return 0;
}

Im obigen Code wird Klasse B zuerst vor Klasse A deklariert. Auf diese Weise kann Klasse B normal verwendet werden, wenn Klasse A definiert wird. In Klasse A wird ein Zeiger b_ptr definiert, der auf Klasse B zeigt, und dem Zeiger wird über die Mitgliedsfunktion foo() ein Wert zugewiesen. Gleichzeitig definiert Klasse B normalerweise auch ihre eigenen Mitgliedsvariablen und Mitgliedsfunktionen und weist der Mitgliedsvariablen b_var über die Mitgliedsfunktion bar () Werte zu. Abschließend wird in der Hauptfunktion eine Instanz a_obj der Klasse A erstellt und die Memberfunktion foo() aufgerufen. Das Programm kann korrekt kompiliert und ausgeführt werden und die Fehlermeldung „Klassenmitglieder müssen vollständige Typen sein“ wird nicht mehr angezeigt.

Methode 2: Verwenden Sie Zeiger oder Referenzen anstelle von Objekten

Wenn Sie in einer Klasse auf Mitgliedsvariablen oder Mitgliedsfunktionen in einer anderen Klasse zugreifen müssen, die Klassendefinition jedoch nicht an den Anfang stellen können, kann diese Methode verwendet werden. In diesem Fall können Sie anstelle des Objekts selbst einen Zeiger oder eine Referenz auf das Objekt übergeben. Dies vermeidet auch den Fehler „Klassenmitglieder müssen vollständige Typen sein“. Der Code ist wie folgt implementiert:

class B; //提前声明类B

class A {
    private:
        B* b_ptr;
    public:
        void foo();
};

class B {
    private:
        int b_var;
    public:
        void bar();
};

void A::foo() {
    b_ptr = new B;
    b_ptr -> bar();
}

void B::bar() {
    b_var = 10;
}

int main() {
    A a_obj;
    a_obj.foo();
    return 0;
}

Hier haben sich die Definitionen von Klasse A und Klasse B noch nicht geändert, aber in der Funktion foo rufen wir die Mitgliedsfunktion bar() in Klasse B auf, indem wir den Zeiger b_ptr der Klasse bearbeiten B. Gleichzeitig wird in Klasse B dasselbe Schema verwendet, um auf die Mitgliedsvariable b_var zuzugreifen.

Die beiden Methoden sind unterschiedlich und der spezifische Plan kann entsprechend Ihren Bedürfnissen und Ihrer Situation ausgewählt werden. Aber im Allgemeinen können diese Lösungen Kompilierungsfehler vermeiden, die durch „Klassenmitglieder müssen vollständige Typen sein“ verursacht werden. Ich hoffe, dieser Artikel ist hilfreich für Sie.

Das obige ist der detaillierte Inhalt vonC++-Syntaxfehler: Klassenmitglieder müssen vollständige Typen sein, wie gehe ich damit um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn