0

これに似た質問がたくさんあるにもかかわらず、このような簡単な質問に答えられるものを見つけることができません。

次のコード内で、次のエラーが生成されます (G++ を使用): 'error: field 'CompoundField' has incomplete type':

class SimpleClass;
class CompoundClass;

class CompoundClass{
    public:
    SimpleClass CompoundField;
};

class SimpleClass{
    public:
    unsigned int SimpleField;
};

int main(){
    CompoundClass obj;
    obj.CompoundField.SimpleField=5;
    return 0;
}

両方のクラスが前方宣言されているのに、これはなぜですか? 簡単な解決策は、を のCompoundClass後に移動するSimpleClassか、 へCompoundFieldのポインタを作成することSimpleClassですが、ここでの根本的な問題の説明にはなりません。

より正確に言うと、これはコンパイラがクラスのサイズ (つまりSimpleClass)を認識していないことが原因であることが他の回答で示されていSimpleClassます。

4

1 に答える 1

4

コンパイラはこれを見ます

class SimpleClass;
class CompoundClass;

class CompoundClass{
    public:
    SimpleClass CompoundField;
};

必要なメモリ量を把握する必要があります (メモリ要件CompoundClassについての手がかりはありません)。SimpleClass

int や文字列などの数がわからないため、スペースを確保する必要があります。手を上げます。

しかし、あなたがした場合

class SimpleClass;
class CompoundClass;

class CompoundClass{
    public:
    SimpleClass *CompoundField;
};

次に、それはわかります-ポインターが必要なだけです(void *すべての不測の事態に十分です!)

于 2013-03-07T02:51:07.920 に答える