プロが教える店舗&オフィスのセキュリティ対策術

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++です。よろしくお願いします。

A 回答 (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__
--------

↑こんな風にすると良いです。
    • good
    • 1
この回答へのお礼

丁寧なご回答ありがとうございました。急いでいたので助かりました。

お礼日時:2005/03/29 18:40

ヘッダファイルは, 何回 #include してもよいように書くのが基本です.


そのためによく使われるのが
#ifndef some_identifier
#define some_identifier
ここにヘッダファイルの本体を書く
#endif
という手法です. some_identifier をヘッダファイルごとに決めておけば (ヘッダファイルの名前から決めると楽) OK.
このような手法はシステム標準のヘッダファイルでも使われていますので, そちらも参考にしてはどうでしょうか.
    • good
    • 0
この回答へのお礼

本当に助かりました。ありがとうございました。

お礼日時:2005/03/29 18:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!