C プログラミングでは、単純なエラーが原因でプログラムが正しくコンパイルできないことがよくあります。よくある間違いの 1 つは、クラスのメンバーが完全型でなければならないということです。このエラー メッセージは、クラス メンバー変数またはメンバー関数を定義するときに、使用されるデータ型が完全な型ではないため、コンパイラがクラス メンバーのデータ型を認識できないことを示します。
このタイプのエラーは、クラス間の相互参照の場合に発生する可能性があります。たとえば、クラス A はクラス B を参照する必要がありますが、クラス A が宣言される前にクラス B が定義されていない場合、クラス A で定義されているメンバ変数またはメンバ関数にクラス B が関与している場合にこのエラーが発生することがあります。
では、このエラーはどのように処理すればよいのでしょうか?以下に、考えられる 2 つの解決策を示します。
方法 1: 事前に宣言されたクラス
この方法は、比較的シンプルで効果的な解決策です。クラスAを定義する際に、クラスBをクラス外で事前に宣言することができます。このようにして、クラス A でクラス B が使用されている場合、コンパイラはこの型を認識できます。コードの実装は次のとおりです。
class B; //提前声明类B class A { private: B* b_ptr; public: void foo(); }; class B { private: int b_var; public: void bar(); }; void A::foo() { b_ptr = new B; } void B::bar() { b_var = 10; } int main() { A a_obj; a_obj.foo(); return 0; }
上記のコードでは、クラス A の前にクラス B が事前に宣言されています。このようにして、クラス A を定義するときにクラス B を通常どおりに使用できます。クラス A では、クラス B を指すポインター b_ptr が定義され、そのポインターにはメンバー関数 foo() を通じて値が割り当てられます。同時にクラスBも通常通り独自のメンバ変数とメンバ関数を定義し、メンバ関数bar()を通じてメンバ変数b_varに値を代入します。最後に、クラス A のインスタンス a_obj が main 関数で作成され、メンバー関数 foo() が呼び出されます。プログラムは正しくコンパイルおよび実行でき、「クラス メンバーは完全な型である必要があります」というエラー メッセージが表示されなくなりました。
方法 2: オブジェクトの代わりにポインターまたは参照を使用する
クラス内の別のクラスのメンバー変数またはメンバー関数にアクセスする必要があるが、クラス定義を先頭に置くことができない場合は、次のようにします。この方法が使えます。この場合、オブジェクト自体の代わりに、オブジェクトへのポインターまたは参照を渡すことができます。これにより、「クラス メンバーは完全な型である必要があります」というエラーも回避されます。コードは次のように実装されます。
class B; //提前声明类B class A { private: B* b_ptr; public: void foo(); }; class B { private: int b_var; public: void bar(); }; void A::foo() { b_ptr = new B; b_ptr -> bar(); } void B::bar() { b_var = 10; } int main() { A a_obj; a_obj.foo(); return 0; }
ここでは、クラス A とクラス B の定義はまだ変更されていませんが、foo 関数では、クラス B のポインター b_ptr を操作してクラス B のメンバー関数を呼び出します。クラス B.bar()。同時に、クラス B では、同じスキームを使用してメンバー変数 b_var にアクセスします。
2 つの方法は異なり、ニーズや状況に応じて具体的なプランを選択できます。ただし、一般に、これらの解決策は、「クラス メンバーは完全な型である必要がある」ことによって引き起こされるコンパイル エラーを回避できます。この記事がお役に立てば幸いです。
以上がC++ 構文エラー: クラス メンバーは完全型である必要があります。どのように対処すればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。