- ベストアンサー
IncludeではなくClassで宣言するケース
C++で、IncludeではなくClassで宣言すべきとき/Classで宣言した方が良いときとはどのようなときなのでしょうか? ※クラスの相互参照のケース以外について知りたいです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
インクルードせずに、プロトタイプを使う理由としては、 ・相互参照がある場合 ・includeによるコンパイルにかかる時間を減らす 程度でしょう。 よくあるパターンとしては #include <boost/ptr_container/ptr_vector.hpp> class ClassA {...}; class ClassB { boost::ptr_vector<ClassA>; }; のようなヘッダがあり、プリコンパイル済みヘッダが使えないような場合、boostのような コンパイルに時間がかかるヘッダを出来るだけインクルードしなくて良いようにするために 上記のインクルードではなく class ClassB; とプロトタイプ宣言で参照し、どうしても必要な箇所だけincludeする、という構造にすることがあります。
その他の回答 (5)
- wormhole
- ベストアンサー率28% (1626/5665)
>クラスの定義をするときに、 >そのクラスが必要とするヘッダファイルを#Includeで取り込む際、 >#Includeで取り込むのではなく、 >Class XXX として記載するケースがあると思います。 単にクラスXXXがあることがわかればいいだけのケースではないですか。
お礼
ありがとうございます! 使いたいクラス、関数のプロトタイプ宣言までを取り込ませたい場合、#includeにし、 単にクラスxxxがあることがわかれば良いケースでは、前方宣言を使うことにします。
- kmee
- ベストアンサー率55% (1857/3366)
とりあえず。 勝手に言葉作らないでください。 使うなら、その意味を説明してください。 ○#includeを使う場合 // ファイル: test0.h class testA { 定義... } ; // ファイル: test0.cpp #include "test.h" int main(){ testA objA ; } ○ 質問者が言うところの「Classで宣言」と思われるもの // ファイル: test1.cpp class testA { 定義... } ; int main(){ testA objA ; } でよろしいのですか?それとも別のなにかですか? もし、この2つなら、単一ソースファイルで使うときは、まったく等価です。
お礼
意図を伝えられず申し訳ありません。 前方宣言のことをお聞きしようとしていました。 ありがとうございます。
- ryuzoji21
- ベストアンサー率50% (6/12)
あまり詳しくはないですが参考までに。 class ~~とクラス名を書くのは、恐らく前方宣言ではないでしょうか。 2つのクラスがお互いのクラスを参照し合っている時に、どちらかのクラスを、中身は書かずにclass クラス名;とだけ書いておいて、後で中身を書くという方法があります。 いずれにせよ、include文は他のヘッダファイルの内容を読み込むものなので、classと使い分けるとかそういうものではないと思います。
お礼
ありがとうございます。 ご察しの通り前方宣言のことでありました。 (他の回答者さんのご回答のように、違いはあるようです)
- Tacosan
- ベストアンサー率23% (3656/15482)
union も仲間に入れてあげてください>#1.
お礼
そういうのもあるのですね。 ありがとうございます。
- wormhole
- ベストアンサー率28% (1626/5665)
質問の意図がわからないんですが・・・ クラスの定義ができるのはclassかstructだけで、 #includeでクラスの定義はできませんけど。
お礼
意図を伝えられず、申し訳ありません。 クラスの定義をする際の話ではなく、クラスを使うときの話でありました。 ありがとうございます。
補足
クラスの定義をするときに、 そのクラスが必要とするヘッダファイルを#Includeで取り込む際、 #Includeで取り込むのではなく、 Class XXX として記載するケースがあると思います。 どういうときに#Includeを使い、 どういうときにClassを使うのかを知りたいです。 .
お礼
ありがとうございます! 今までは「関数のin/outのパラメータまで情報が渡る分の、includeの方が良いのかな?」と思っていましたが、 大きなクラス、大量のincludeだとコンパイルに時間がかかるので、そういうケースでは、前方宣言にすることにします。 ありがとうございました!