16

ヘッダー ファイル ah があり、その中で 1 つの構造体を宣言しています。その構造の名前は ですfile。内部fileには、a、b、c の 3 人のメンバーがいます。a.cpp では、その構造を実装し、その構造変数にいくつかの値を割り当てました。

今、別のファイル bh があり、その中に構造体の前方宣言がありますfile。この時点までコンパイルしてもエラーは表示されませんが、その b.cpp クラスを介してその構造体に存在する変数にアクセスしようとすると、「未定義の構造体」のようなエラーが発生します。

私は何を間違っていますか?

4

3 に答える 3

21

エラーの根本原因は何ですか?

型を前方宣言すると、コンパイラはそれをIncomplete typeとして扱います。

前方宣言は、コンパイラに、その型が存在し、特定の型についてそれ以上何もないことを伝えます。そのため、コンパイラがそのメモリ レイアウトを知る必要があるその 型に対して、(オブジェクトの作成やその型へのポインタの逆参照などの)アクションを実行することはできません。

解決:

構造体のメンバーを参照する必要がある場合は、前方宣言を行うことはできません。ソース ファイルにヘッダー ファイルを含める必要があります。これにより、コンパイラが型のメモリ レイアウトを認識できるようになります。それに応じてプロジェクトを設計する必要があります。

于 2012-06-05T09:31:57.317 に答える
11

メンバーにアクセスするには、完全な定義が必要です。を前方宣言するだけでなく、include内部のヘッダーが必要です(不完全な型が生成されます)。b.cppstruct

編集:

次の場合は前方宣言で十分です。

class B;
class C
{
    B& b;
    B* b;
    B foo();
    foo(B b);
};

しかし、そうではありません

class B;
class C
{
    B b;   //ERROR
    B foo()
    {
        B x; //error
        x.whatever(); //error
        return B(); //error
    }
};
于 2012-06-05T09:30:29.010 に答える
0

メンバーが使用されている場所に構造体の定義を含める必要があります。そうしないと、コンパイラーはそれらが何であるかを知りません。

したがって、b.cpp にある場合、これは

   func(mystruct &s)
   {
        s.a = 1;
   }

コンパイラは、割り当てに到達するまで問題ありません。その時点で、「mystruct」内の「a」の定義を見つけようとしますが、見つかりません。

#include "a.h"b.cpp にする必要 があります。または、ah の内容によっては、構造体用に別のヘッダーを作成して含める必要がある場合があります。

于 2012-06-05T09:38:41.933 に答える