2009-10-16 13 views
9

複数のソースファイルに1つのクラス(1つの.h)を実装すると何か問題はありますか?私はこれが単一のクラスで多すぎるコードの症状になる可能性があることを認識していますが、技術的に何か問題がありますか?例えば複数のインプリメンテーションファイルを持つ1つのクラス

foo.hという

class Foo 
{ 
    void Read(); 
    void Write(); 
    void Run(); 
} 

Foo.Read.cpp

#include "Foo.h" 
void Foo::Read() 
{ 
} 

Foo.Write.cpp

#include "Foo.h" 
void Foo::Write() 
{ 
} 

Foo.Run.cpp

#include "Foo.h" 
void Foo::Run() 
{ 
} 

答えて

13

これは問題ありません。結局、それはすべて一緒にリンクされます。

すべてのメンバー関数が異なる* .cppファイルにあるコードも見たことがあります。

+1

それは私をひどく運転するでしょう。私は確かにこれを行う理由は良い(または少なくともまともな)理由があるが、オブジェクトモデルを理解しようとする観点から、...ファイルをジャンプしてメソッドを回避する必要があります。 – Joe

+1

ライブラリを構築する場合、関数とグローバルをそれぞれのオブジェクトに分割することで、消費者は参照するビットだけをリンクすることができます。しかし、それを扱うのは面倒です。 – ephemient

+1

@ephemient:これはなぜ問題なのですか?あなたが使用していない機能をリンカが取り除くことはできませんでしたか?それとも、リンク時間を改善するだけですか? –

4

これは技術的に間違っていません。リンカーはFooのすべての部分を最終的なバイナリにまとめます。

1

私はApache Portable Runtimeを使って作業していますが、これはかなり正確です。ヘッダーは、apr_client.hとそのヘッダー内の関数用の複数の実装ファイル(各ファイルはクライアント操作の1つの側面を表す)を持っています。それは間違いではなく、それは本当に珍しいことではありません。あなたは、クラス名に応じてファイル名を選択する必要はありませんので

この

は、

C++は、Javaではない単一のクラスでも多くのコードの症状である可能性があります。

0

実際には、C#のような新しい言語は、常にそのようなことをしています。合法的であり、それはいくつかの(!?)の利点を持っている

6

...

あなたは、このクラスの静的ライブラリと実行可能ファイルをリンクする場合は、のみ使用される関数がで取得します。これは、限られたために非常に便利です-resource systems。

特定の機能の実装の詳細を非表示にすることもできます。 2人はお互いを知らずにクラスの一部を実装することができます。 DODプロジェクトに便利です。

あなたが任意のCRTのソースを見れば、あなたは同じパターンが表示されます...

+1

同じクラスの実装の詳細を隠すことは本当にそれを伸ばしています。そう簡単に分割できるクラスがあれば、それは2クラスではなく1クラスでなければなりません。 –

+0

@リチャード:まあ、私はあなたがそれをすることができると言いたかった、あなたはそれをする必要はありません。関数がとても簡単な場合は、別のクラスを作成したくないかもしれません... – Malkocoglu

+1

@Richard - eh? - 例えば "foo"のような "デバイス"について:: foo :: write foo :: ioctl短いビルド時間のメリットについて教えてください。 – pgast

2

それは完全に有効です。すべてのcppファイルがリンクされます。

これは、非常に大きなインプリメンテーションファイルを読みやすくするために役立ちます。各cppファイルはコンパイル単位であるため、その事実を(ab)使用することができます。 (無名の名前空間など)

+0

+の内部リンケージの機会が増えた –

0

考慮すべき点が2つあります。そのファイルを解析するとき、コンパイラは(単一TUコンパイラを仮定する)、それに見えるメンバ関数の全てを有する場合

別部材との間の最適化を実行することができるかもしれない:

クラス広い最適化が

機能。

コードレビュー

クラスのすべての定義は同じTUである場合、これは手動のコードレビューが容易になります。定義が異なるTUに分割されている場合、適切なファイルを検索する必要があるため、手動でのレビューに必要な作業が大幅に増加します。

関連する問題