No.3ベストアンサー
- 回答日時:
非常におおざっぱに言えば、
私は簡単なプログラムしか作らないので、分割コンパイラなんかしないで、全部ひとつのファイルに書き込みます
というのと、似た議論です。
すべてをヘッダファイルに入れるのは、できないことではありません。すべてを単一のファイルにしてプログラムすることが可能であるのと同じように。
けれど、ある程度の規模のファイルは、分割コンパイルしましょう。
それと同じように、ある程度のクラスの規模になれば、処理の実体は、ヘッダファイルから切り離しましょうということです。
おそらく、質問された方もこれはおわかりだと思います。
その上で、危険なのが、「ある程度のクラス規模」という判断基準が、結構いい加減だと言うこと。そして、プログラミングには、慣れという要素が非常に大きいと言うこと。
よくある「肥大化」ケースは、まずもって、小さなプログラムからスタートします。それが、機能拡張やちょっとした修正の繰り返しで、巨大なプログラムになります。
それだけではなく、「今は」簡単なクラスしか作らないかもしれません。そして、たいていは、少しずつ複雑なクラスを作るようになるものです。
そのときに、「ここまでくれば、ヘッダに詰め込むのは無理だ」と思えるか、それとも、徐々に規模が大きくなったために、いつの間にか、巨大なヘッダファイルを作っているか。
このあたりは、実際に、その後幸せになるか不幸になるかの分かれ道だったりします。
そういうわけで、「簡単なクラスしか作らないから」というのは、理由として危険かなと思います。
いつか、複雑なクラスを作るようになっても、同じ流儀でやってしまっているというのは、それなりの割合で見られる例です。
あと、他の人が or 時間がたってから、そのクラスを使おうとして、.cpp はどこにある? と、パニックにおそわれるという可能性も指摘しておきます。
ご回答いただき,ありがとうございます!!
今は学生で,自分ひとりしか使わないクラスです。
将来は仕事でプログラムを書くかもしれないので,
今後は,再利用のしやすいプログラムを目指します。
“ある程度のクラス規模”は難しい判断ですね (^^
ありがとうございました。
No.4
- 回答日時:
何か否定的な意見が多いようですが、Boostにせよ、STLにせよ、ヘッダファイルをインクルードするだけで大部分の機能を利用することができます。
今後、仮にexportをサポートするコンパイラが普及したとしても、この便利さに味をしめてしまうと、なかなかインクルードベースの方式を捨てづらい気がします。テンプレートを活用しだすと、翻訳単位の分割ではなく、ヘッダファイルの分割だけで済んでしまいます(ヘッダファイルの分割は必須だと思います)。用途によっては、こちらの方向性の方が得策だと思いますが、いかがでしょうか?
確かに、世の中にはライブラリのソースコードを見て「main関数がありません!」とパニックになる人もいますから、<boost/shared_ptr.hpp>を使うのに「.cppがありません!」とパニックになる人がいてもおかしくはありませんが、それはその人の無知に問題があるだけのような気がします。
ご回答いただき,ありがとうございます!!
STL なら言葉は聞いたことがありますが,
Boost は少し初耳の言葉だったりします。
早速,本で調べて勉強してみます。
質問して少しずつ賢くなれるのが嬉しいです (^^
ありがとうございました。
No.2
- 回答日時:
C++に於いて、ヘッダ内で関数を定義すると、インライン関数として扱われます。
また、C++のヘッダはドキュメントとして扱われることも多く、ライブラリなどでは.h、.lib、.dllだけ公開されて.hに関数の使い方や、引数、また各種例外まで文書として書かれていることもあります。
この場合、実体がヘッダに書かれていると非常に見にくくなります。
それに、ヘッダ内でのみ記述する場合と、ヘッダとソースに分けて記述する場合とで宣言に微妙な差異があることも多く、オススメできません。
まだ簡単なプログラムしか組んでいなく、必要性を理解できないかもしれませんが、絶対必要になることです。
今から分けることを当たり前として、後に苦労しないようする方が賢明と思います。
ご回答いただき,ありがとうございます!!
後に苦労するのは嫌です。
将来のことを考えて,分けて記述することにしました。
ありがとうございました。
No.1
- 回答日時:
ヘッダファイルだけを用意して簡単に使いたいという気持ちはよくわかります。
実際、その方が便利ですし、リンクの面倒を考えると他の環境に移植するのも(環境に依存したコードが少なければ)楽です。ヘッダファイルだけで何とかするには、主に2つの方法があります。
1. ヘッダファイル内で定義する関数をインライン関数にする。
2. ヘッダファイル内で定義する関数をテンプレートにする。
1.と2.の組み合わせでもかまいません。
多くの場合、これらを実践するだけで、大多数のライブラリをヘッダファイルだけで済ませることができるようになります。
欠点としては、ファイル間の依存関係が強くなるので、少し修正しただけでも再コンパイルされることが多く、ビルドに多少時間がかかることです。ただし、一度ライブラリを完成させてしまえば、以後は圧倒的に楽になります。
ご回答いただき,ありがとうございます!!
インライン関数とテンプレートは,すこし勉強した
程度で,今回復習してみました。
そしたら大変良い勉強になりました。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
アプリケーション終了時例外エ...
-
ファイル名の先頭にアンダース...
-
ファイルからサイズ不明の行デ...
-
COM相互運用機能のON,OFFによる...
-
Excelマクロでの再読込み方法
-
SGファイルって何ですか?
-
ドラッグアンドドロップでファ...
-
Javascript で INI の読み書き
-
Access2010の最適化設定について
-
■ 移植性のないポインタ変換に...
-
EXEファイルに画像ファイルの埋...
-
グローバル変数のよくない使い...
-
動画の処理
-
分割コンパイルの#defineについて
-
C言語のfopenについて教えてく...
-
UTL_FILEにて既存のExcelに追加...
-
バッチで118項目のCSVを処理し...
-
テキストファイルの最終行を削...
-
RPGでファイル名(もしくはレコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
csvファイルを開かずに文字を検...
-
ファイル名の先頭にアンダース...
-
Excelマクロでの再読込み方法
-
テキストファイルの最終行を削...
-
C言語のfopenについて教えてく...
-
ASP .NETでファイル選択ダイア...
-
CSVファイルへの保存の際、デー...
-
SGファイルって何ですか?
-
VBに、Cのincludeのようなもの...
-
VBAにてEXCEL以外のファイル(テ...
-
アプリケーション終了時例外エ...
-
大きいサイズのテキストファイ...
-
fopenできる上限の変更
-
ドラッグアンドドロップでファ...
-
分割コンパイルの#defineについて
-
バッチで118項目のCSVを処理し...
-
【C#】リソースファイルの埋め...
-
マウスポインタの変更
-
XMLファイルの表示について
おすすめ情報