- ベストアンサー
classの再定義エラーについて
C++初心者で初歩的な質問ですがよろしくお願いします。 【内容】 <test.h> class testを定義 <test2.h> class testを継承したclass test2を定義 <test3.h> class testを継承したclass test3を定義 <test4.h> class test2とclass test3で作成したインスタンスをメンバに持つclass test4を定義 【問題】 test2.hとtest3.hではclass testを継承するために#include "test.h"をしています。そして、test4.hではclass test2とclass test3を使うため#include "test2.h"、#include "test3.h"をしているのでredefinition of 'class test'というエラーが発生します。 このようなエラーを発生させずに上記の内容のものを実現させることは出来るのでしょうか? ちなみにOSはTurboLinux8でコンパイラはg++です。よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
test.hの先頭に次の2行を追加してください。 #ifndef __TEST_H__ #define __TEST_H__ また、最後に次の行を追加してください。 #endif __TEST_H__ もちろん、test2.hやtest3.hもインクルードが重なる可能性がある場合は__TEST2_H__や__TEST3_H__で最初と最後に行を追加してあげましょう。これらは標準ヘッダファイル(stdio.hなど)で使われているテクニックです。 基本的にはヘッダファイルは必ずこれらの行でくくるようにしてあげると良いでしょう。 test.h -------- #ifndef __TEST_H__ #define __TEST_H__ ヘッダファイルの内容~~~ #endif __TEST_H__ -------- ↑こんな風にすると良いです。
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
ヘッダファイルは, 何回 #include してもよいように書くのが基本です. そのためによく使われるのが #ifndef some_identifier #define some_identifier ここにヘッダファイルの本体を書く #endif という手法です. some_identifier をヘッダファイルごとに決めておけば (ヘッダファイルの名前から決めると楽) OK. このような手法はシステム標準のヘッダファイルでも使われていますので, そちらも参考にしてはどうでしょうか.
お礼
本当に助かりました。ありがとうございました。
お礼
丁寧なご回答ありがとうございました。急いでいたので助かりました。