1

「struct mnode」の上に「struct node」を置くことができないこのようなコードがあるので、以下に示すように、それを上に宣言しました。
しかし、コンパイラは、フィールド n の型が不完全であると言います。
一番上に構造体を正しく宣言する方法は??

struct node;
struct mnode{
    int j;
    node n;
};
struct node{
    int k;
};
4

3 に答える 3

5

クラス型のクラス メンバーの場合は、定義が必要です。宣言はしません。したがって、この場合、 の完全な定義は のnode前に来る必要がありmnodeます。

前方宣言は、完全な定義 (ポインターまたは参照メンバー、戻り値の型、またはメソッド パラメーター) が必要ない場合にのみ機能します。

于 2013-10-17T15:00:41.320 に答える
1

それnodeは...まあ不完全だからです。構造体/クラス定義に不完全な型のフィールドを含めることはできません。ただし、ポインターのサイズがわかっているため、ノードへのポインターを使用できます。

struct node;
struct mnode{
    int j;
    node* n;
};
struct node{
    int k;
};
于 2013-10-17T15:02:00.913 に答える
1

mnodeコンパイラは、より多くの情報が必要ないくつかのことを知る必要があるため、不平を言いますnode。まず、mnodeオブジェクトを構築できるようにするためには、オブジェクトのサイズを知る必要がありますが、そのためには のサイズを知る必要がありnodeます。また、次の関数を生成する方法も知っている必要があります。

  • デフォルトのコンストラクタ
  • デストラクタ
  • コンストラクターのコピーと移動
  • 代入演算子のコピーと移動

そのためには、対応する関数が必要nodeです。他にも何か忘れているかもしれませんが、nodeかなり多くのことについて の完全な定義が必要であることがわかります。いいえ、事前申告は行いません。

nodeなんらかの理由での完全な定義を提供できない場合は、 の型nを、たとえば a に変更することに頼ることができますnode*。コンパイラはポインタに関するすべての情報を持っているので、問題はありません。

于 2013-10-17T15:13:12.543 に答える