クラス、関数の内容で変わるかも知れませんが
関数のプログラム内容は "cppファイル" に書くべき?
"ヘッダーファイル" だけでも OK?
皆さんはどうしてますか?
環境:VC++6 Windows XP
--------------------------------------
プログラム例
//***************************
// ヘッダー だけの記述
//***************************
// hoge.h
class hoge
{
int hogehoge()
{
return 1;
}
}
//***************************
// ヘッダー と cpp に記述
//***************************
// hoge.h
class hoge
{
int hogehoge();
}
// hoge.cpp
hoge::hogehoge()
{
return 1;
}
自分は「原則として、できる限りヘッダーに記述」でやってます。
その理由
1.ヘッダーのclass内に記述された関数はインライン扱いに
なるので、処理速度向上をやや期待できる。
2.クラス名をいちいち書かなくて良いので、コード量が減少。
特にテンプレートなど。
3.前方参照、相互参照が、暗黙にはできなくなるので、より
シンプルな関係のクラスに設計せざるを得なくなる。
4.メンバ関数の戻り値、引数の変更が1箇所だけになるので、
すばやく対応できる。
デメリットとしては、
1.少しの変更が多くのソースに影響しやすいので、コンパイル時間が
長くなりがち。
2.MFCのウイザードコードもできるだけヘッダーに展開しなおすので
手間がかかる。
3.ヘッダーが長くなるので、そのクラスにどんな機能、関数があるのか
把握しづらい。
4.インデントの関係でコードが右よりになりがち、デバッグのとき
見づらい場合もある。
仲澤@失業者さん
ありがとうございます。
自分も最近はヘッダーファイルに書いてたんですが
これっていいのかな?
とか思っちゃいまして。。。
自分は仲澤ほど考えてなかったです。。。
仲澤さんの書いた
メリット
2、4
デメリット
3,4
位しか考えてなかったです。。。
参考にさせてもらいます。
>1.ヘッダーのclass内に記述された関数はインライン扱いに
なる
…絶対にそうなる?
>…絶対にそうなる?
インライン扱いだそうですが、
そもそもインラインとは、
「インライン化されることが確約されているわけではない」
という点を忘れてはなりません。
この条件はinlineキーワードで宣言しようが__forceinline
にしようが変わりません。
従って
「インライン扱いは確約されたが、インライン展開されるかどうかは不明」
ということです。
だから「やや期待できる」という表現になるわけです(vv;)。
あと、メリットに追加する項目としては
5.関数の修飾 virtual const public protected private 等が
(その場に書いてあるので)すぐ分かる。
というのも入れても良いかも。
私はヘッダにコードは出来る限り入れないですね。
作っている最中はヘッダにコードがあった方が書きやすいのかもしれませんが,使う時には実装コードが邪魔です。
あと,無名namespaceとかもヘッダに書くと大量増殖する都合上使えないなど,問題点も大きいです。
もちろん,templateなどのinline系のものはヘッダに書きますが。
> 皆さんはどうしてますか?
どうしてこんなことを聞いているんですか?
ファイルをヘッダ(.h)と実装(.c/.cpp)に分けている理由を考えれば
自明でしょ。
まあ、CPUが早くなったためにコンパイル時間が短くなってきているので
あまり気にしなくなっているのかな?
ヘッダにコードを書くのは違和感がありますが。
昔、クラス情報(おもに、クラス内変数)を別の管理下のクラスに送る時、
ヘッダに関数を入れるとその関数が動くので、一時期そんなことをしてました
が、やっぱ、ヘッダに処理を書くのは違和感あるなぁ・・・・
でもヘッダに書くとしたら、Set,Get系が限界。。。
やるのなら XXX.h じゃなく XXX.cpp で組み込みたい(単純に.hに処理を入れるのことに違和感があるだけかもね)
Java から入った人はヘッダにコードを書きたがる傾向にある気がします。
便利なマクロの代わりみたいなコードならヘッダー
思いつく例はintsafe.h とか・・・
それ以外は分けますね^^
ツイート | ![]() |