2013-04-25 2 views
8

コード:お互いにアクセスできる2つの構造体を実装するにはどうすればよいですか?私が書いたものを

struct A; 
    struct B; 
    struct A 
    { 
     int v; 
     int f(B b) 
     { 
      return b.v; 
     } 
    }; 

    struct B 
    { 
     int v; 
     int f(A a) 
     { 
      return a.v; 
     } 
    }; 

コンパイルメッセージ:

|In member function 'int A::f(B)':| 
11|error: 'b' has incomplete type| 
7|error: forward declaration of 'struct B'| 
||=== Build finished: 2 errors, 0 warnings (0 minutes, 0 seconds) ===| 

私はそのコードが正しくない理由を、知っているが、私はそれができる2つの構造体を実装する方法がわかりません互いにアクセスする。エレガントな方法はありますか?前もって感謝します。

+0

これはCではないので、C++と再タグ付けしました。 – unwind

答えて

16

あなたのメンバ関数の正確な同じシグネチャを維持したい場合は、両方のクラス定義が

// forward declarations 
    struct A; 
    struct B; 

    struct A 
    { 
     int v; 
     int f(B b); // works thanks to forward declaration 
    }; 

    struct B 
    { 
     int v; 
     int f(A a); 
    }; 

    int A::f(B b) { return b.v; } // full class definition of B has been seen 
    int B::f(A a) { return a.v; } // full class definition of A has been seen 

を見てきたまで、メンバ関数の定義を延期する必要がありますまた、(const&関数の引数を使用する場合がありますABが大きい場合のパフォーマンスが向上します)、両方のクラス定義が見えるまで関数定義を延期する必要があります。

+1

そして、私は 'const A&a'のようなものが存在することを指摘したいと思います。 – Vyktor

+0

あなたは、ポインタが必要ではないと主張し、あなたのコードをテストする唯一のものです!あなたはC++の専門家です! – Sayakiss

+0

@Vyktor tnx、その旨の文章を追加しました。 – TemplateRex

関連する問題