8

私が書いたコード:

    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 つの構造体を実装する方法がわかりません。エレガントな方法はありますか?前もって感謝します。

4

1 に答える 1

17

メンバー関数のまったく同じ署名を保持したい場合は、両方のクラス定義が表示されるまでメンバー関数の定義を延期する必要があります

    // 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が大きい場合のパフォーマンスが向上します) が、その場合でも、両方のクラス定義が表示されるまで関数の定義を延期する必要があります。

于 2013-04-25T09:05:43.873 に答える