2016-07-28 8 views
1

Ich laufe wirklich in der fehlenden Wort zu sagen für beide Seiten enthalten, aber bedenken Sie:Wie deklariert man zwei gegenseitig (zirkulär-abhängige) Klasse in C++ mit Trennung?

struct A; 
struct C; 
struct A { 
    struct B{ 

    }; 
    C* c; 
}; 
struct C{ 
    A::B* b; 
}; 

Ganz konfus aber einen Sinn und compiliert macht.

Aber wenn A und C größere und komplexere Klassen sind, ist es natürlich, sie auf zwei Dateipaare zu trennen. Dann schreibe ich:

//a.h 
#pragma once 
#include "c.h" 
struct A{ 
    struct B{ 
    }; 
    C* c; 
}; 
//c.h 
#pragma once 
#include "a.h" 
struct C{ 
    A::B* b; 
}; 

mit ihren entsprechenden .cpp-Dateien. Das wird definitiv nicht funktionieren. Also frage ich mich, ob es eine Möglichkeit gibt, struct A und C zu trennen (oder besser, wenn keine Anforderung für die endgültige Verwendung)?

+0

Nur vorwärts deklarieren C in a.h? Forward-Deklaration von A :: B ist nicht möglich, also verschiebe B aus A – paulm

+0

Forward-Deklaration vor oder nach '# include'? Keine Möglichkeit, B in A zu erhalten? – YiFei

+0

Nein, ich glaube nicht, das ist in der Lage – paulm

Antwort

2
//a.h 
#pragma once 
struct C; 
struct A{ 
    struct B{ 
    }; 
    void call_c_member(); 
    C* c; // here is you can use incompelete type 
}; 
//a.cpp 
#include "c.h" 
... 
void A::call_c_member() { 
    // here is the C class is already complete type 
    c->func(); 
} 

//c.h 
#pragma once 
#include "a.h" 
struct C{ 
    void func() {} 
    A::B* b; 
}; 
//c.cpp 
#include "c.h" 
... 
+0

Dann kann ich nicht seine Mitgliedsfunktion aufrufen: O – YiFei

+0

Sie können, wenn Sie verschieben die Definition von Elementfunktionen in a.cpp. – AnatolyS

+0

Oh großartig! Wenn ich einfach a.cpp und c.cpp kombiniere, wird alles gesetzt. – YiFei

Verwandte Themen