2016-07-28 2 views
1

私は本当に相互に含まれていると言っためにある言葉の欠如に実行されますが、考えてみます。2つの相互に包含する(循環依存)クラスをC++で分離して宣言するにはどうすればいいですか?

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

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

かなり混乱が、いくつかの意味とコンパイルを行います。

しかし、AとCはより大きく、より複雑なクラスであるとき、それはファイルの2組にそれらを分離するのが自然です。次に、私は書いています:

//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; 
}; 

と対応する.cppファイル。これは間違いなく機能しません。だから、struct ACを分ける方法があるのだろうか?

+0

だけ前方a.hにCを宣言? A :: Bの前方宣言はできませんので、BをAの中から移動してください – paulm

+0

'#include'の前後に前方宣言していますか? AのBを保存する方法はありませんか? – YiFei

+0

いいえ私はthatsができるとは思わないいいえ – paulm

答えて

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

私はメンバー関数を呼び出せません: – YiFei

+0

メンバー関数の定義をa.cppに移動します。 – AnatolyS

+0

すごい!つまり、私がa.cppとc.cppを組み合わせただけの場合、すべてが設定されます。 – YiFei

関連する問題