• 締切済み

プログラムファイルの分割で…

C++ でプログラムファイルを分割するとき,疑問に思うことがあります。 私はいつも,分割ファイルはヘッダファイルのみ用意しています。 関数の定義などすべてを,ヘッダファイルの中に書き込みます。 しかしキチンとしたプログラミングの本には   XXX.cpp   XXX.h と,二種類のファイルで分割ファイルを作成しています。 簡単なクラスしか作らないので,私は   XXX.h のみ用意して,簡単に使いたいのです。 私の方法でエラーなどが出たことはありませんが, 方法として,あまりオススメできないものなのでしょうか。

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

何か否定的な意見が多いようですが、Boostにせよ、STLにせよ、ヘッダファイルをインクルードするだけで大部分の機能を利用することができます。今後、仮にexportをサポートするコンパイラが普及したとしても、この便利さに味をしめてしまうと、なかなかインクルードベースの方式を捨てづらい気がします。 テンプレートを活用しだすと、翻訳単位の分割ではなく、ヘッダファイルの分割だけで済んでしまいます(ヘッダファイルの分割は必須だと思います)。用途によっては、こちらの方向性の方が得策だと思いますが、いかがでしょうか? 確かに、世の中にはライブラリのソースコードを見て「main関数がありません!」とパニックになる人もいますから、<boost/shared_ptr.hpp>を使うのに「.cppがありません!」とパニックになる人がいてもおかしくはありませんが、それはその人の無知に問題があるだけのような気がします。

k1220011_2005
質問者

お礼

ご回答いただき,ありがとうございます!! STL なら言葉は聞いたことがありますが, Boost は少し初耳の言葉だったりします。 早速,本で調べて勉強してみます。 質問して少しずつ賢くなれるのが嬉しいです (^^ ありがとうございました。

回答No.3

非常におおざっぱに言えば、 私は簡単なプログラムしか作らないので、分割コンパイラなんかしないで、全部ひとつのファイルに書き込みます というのと、似た議論です。 すべてをヘッダファイルに入れるのは、できないことではありません。すべてを単一のファイルにしてプログラムすることが可能であるのと同じように。 けれど、ある程度の規模のファイルは、分割コンパイルしましょう。 それと同じように、ある程度のクラスの規模になれば、処理の実体は、ヘッダファイルから切り離しましょうということです。 おそらく、質問された方もこれはおわかりだと思います。 その上で、危険なのが、「ある程度のクラス規模」という判断基準が、結構いい加減だと言うこと。そして、プログラミングには、慣れという要素が非常に大きいと言うこと。 よくある「肥大化」ケースは、まずもって、小さなプログラムからスタートします。それが、機能拡張やちょっとした修正の繰り返しで、巨大なプログラムになります。 それだけではなく、「今は」簡単なクラスしか作らないかもしれません。そして、たいていは、少しずつ複雑なクラスを作るようになるものです。 そのときに、「ここまでくれば、ヘッダに詰め込むのは無理だ」と思えるか、それとも、徐々に規模が大きくなったために、いつの間にか、巨大なヘッダファイルを作っているか。 このあたりは、実際に、その後幸せになるか不幸になるかの分かれ道だったりします。 そういうわけで、「簡単なクラスしか作らないから」というのは、理由として危険かなと思います。 いつか、複雑なクラスを作るようになっても、同じ流儀でやってしまっているというのは、それなりの割合で見られる例です。 あと、他の人が or 時間がたってから、そのクラスを使おうとして、.cpp はどこにある? と、パニックにおそわれるという可能性も指摘しておきます。

k1220011_2005
質問者

お礼

ご回答いただき,ありがとうございます!! 今は学生で,自分ひとりしか使わないクラスです。 将来は仕事でプログラムを書くかもしれないので, 今後は,再利用のしやすいプログラムを目指します。 “ある程度のクラス規模”は難しい判断ですね (^^ ありがとうございました。

回答No.2

C++に於いて、ヘッダ内で関数を定義すると、インライン関数として扱われます。 また、C++のヘッダはドキュメントとして扱われることも多く、ライブラリなどでは.h、.lib、.dllだけ公開されて.hに関数の使い方や、引数、また各種例外まで文書として書かれていることもあります。 この場合、実体がヘッダに書かれていると非常に見にくくなります。 それに、ヘッダ内でのみ記述する場合と、ヘッダとソースに分けて記述する場合とで宣言に微妙な差異があることも多く、オススメできません。 まだ簡単なプログラムしか組んでいなく、必要性を理解できないかもしれませんが、絶対必要になることです。 今から分けることを当たり前として、後に苦労しないようする方が賢明と思います。

k1220011_2005
質問者

お礼

ご回答いただき,ありがとうございます!! 後に苦労するのは嫌です。 将来のことを考えて,分けて記述することにしました。 ありがとうございました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

ヘッダファイルだけを用意して簡単に使いたいという気持ちはよくわかります。実際、その方が便利ですし、リンクの面倒を考えると他の環境に移植するのも(環境に依存したコードが少なければ)楽です。 ヘッダファイルだけで何とかするには、主に2つの方法があります。 1. ヘッダファイル内で定義する関数をインライン関数にする。 2. ヘッダファイル内で定義する関数をテンプレートにする。 1.と2.の組み合わせでもかまいません。 多くの場合、これらを実践するだけで、大多数のライブラリをヘッダファイルだけで済ませることができるようになります。 欠点としては、ファイル間の依存関係が強くなるので、少し修正しただけでも再コンパイルされることが多く、ビルドに多少時間がかかることです。ただし、一度ライブラリを完成させてしまえば、以後は圧倒的に楽になります。

k1220011_2005
質問者

お礼

ご回答いただき,ありがとうございます!! インライン関数とテンプレートは,すこし勉強した 程度で,今回復習してみました。 そしたら大変良い勉強になりました。 ありがとうございます。

関連するQ&A

専門家に質問してみよう