「struct mnode」の上に「struct node」を置くことができないこのようなコードがあるので、以下に示すように、それを上に宣言しました。
しかし、コンパイラは、フィールド n の型が不完全であると言います。
一番上に構造体を正しく宣言する方法は??
struct node;
struct mnode{
int j;
node n;
};
struct node{
int k;
};
クラス型のクラス メンバーの場合は、定義が必要です。宣言はしません。したがって、この場合、 の完全な定義は のnode
前に来る必要がありmnode
ます。
前方宣言は、完全な定義 (ポインターまたは参照メンバー、戻り値の型、またはメソッド パラメーター) が必要ない場合にのみ機能します。
それnode
は...まあ不完全だからです。構造体/クラス定義に不完全な型のフィールドを含めることはできません。ただし、ポインターのサイズがわかっているため、ノードへのポインターを使用できます。
struct node;
struct mnode{
int j;
node* n;
};
struct node{
int k;
};
mnode
コンパイラは、より多くの情報が必要ないくつかのことを知る必要があるため、不平を言いますnode
。まず、mnode
オブジェクトを構築できるようにするためには、オブジェクトのサイズを知る必要がありますが、そのためには のサイズを知る必要がありnode
ます。また、次の関数を生成する方法も知っている必要があります。
そのためには、対応する関数が必要node
です。他にも何か忘れているかもしれませんが、node
かなり多くのことについて の完全な定義が必要であることがわかります。いいえ、事前申告は行いません。
node
なんらかの理由での完全な定義を提供できない場合は、 の型n
を、たとえば a に変更することに頼ることができますnode*
。コンパイラはポインタに関するすべての情報を持っているので、問題はありません。