2010-12-17 5 views
2

私はCに慣れています。ヘッダファイルには通常、宣言と定義は含まれていませんが、C++は少なくともクラスとの混合を促しているようです。ヘッダファイルに簡単に入れることができるこのクラス宣言を取る。そのメソッドの中には、インラインで定義されているものもあれば、 "inline"キーワードではなく、クラス宣言自体のようにインラインで定義されているものもあります。特にコンストラクタと4つのgetter/setterヘッダーファイルにメソッド定義を含むクラス宣言を置くことは、C++では悪い書式とみなされますか?

MyClass.h: 

    class MyClass { 
     public: 
      MyClass(int a = 0, int b = 1) : _a(a), _b(b) {}; 
      int getA() { return _a; }; 
      int getB() { return _b; }; 
      void setA(int a) { _a = a; }; 
      void setB(int b) { _b = b; }; 
      void doSomething(); // no definition here; defined in source file 
      void doSomething2(); // no definition here; defined in source file 
      void doSomething3(); // no definition here; defined in source file 
     private: 
      int _a; 
      int _b; 
    }; 

はこの悪い形であり、私はクラス宣言でのみメソッド宣言を残し、ソースファイルに分けてクラスのメソッドを定義する必要があり、またはこれは完全に受け入れているのですか?

答えて

7

ヘッダーを使用しているアプリケーションの「大きな画像」によっては、不正な形式である可能性があります。ヘッダーに実装を入れることで、その実装が変更されたときにヘッダーを変更する必要があります。このような変更は、多くのビルドシステム(例:make)でクライアントオブジェクトの再コンパイルをトリガー/必要とします。対照的に、行外の変更には再リンクが必要な場合があり、共有ライブラリを使用すると、それらのライブラリをクライアントアプリケーションに変更することなく置き換えることができます。したがって、インライン化を使用する特別な理由がない場合、多くのアプリケーションで共有される低レベルのヘッダーは、アウトライン実装を優先します。これは、実装が変更を必要とすると予想される場合に特に当てはまります。

一部の人々が実装を分離することを好むもう一つの理由は、ドキュメントの一種としてAPIを読んでいる人々を混乱させることを避けるためです。読むことが少ないときは一般的にはっきりしていますが、実装が機能を理解するのに役立つこともあります。しかし、実装を見るプログラマは、たとえインターフェイスが厳格な保証をしなくても、動作/パフォーマンスの影響を考え、それに依存するクライアントコードを作成する傾向があります。これにより、実装が変更されるとクライアントコードが壊れやすくなります。

+0

APIビューは重要です。関数定義をスクロールすることなく、すべてのメンバー変数と関数を見るためのコンパクトな場所を用意することは良いことです。 –

+0

@ edA-qamort-ora-yこれはAPIビューではなく、オブジェクトビューです。 APIは厳密にpublicメンバー/メソッドです。基本的に、APIビューはピンプルクラスになります。 – weberc2

3

いいえ、それは完全に受け入れられ、インライン関数やテンプレートの場合は、ほとんどの場合必要になることがあります。

私は人がクラス宣言の後にインライン関数の独自のセクションにライン以上の関数を置くのが好きです。しかし、ほとんどの人はそれをしません。

5

.cppファイルにメソッド定義を入れるのとは少し違ったものを実現するだけでなく、 classブロック内に定義されたメソッドは暗黙的にinlineです。

最近ではinlineはコンパイラにとって大きなヒントではありませんが、違いはあります。特に、コールサイトでコンパイラが容易に利用できるそれらの関数定義を持つと、インライン化が可能になります。これは、セッタ/ゲッターにとって、通常、実行可能ファイルの速度とサイズの両方が向上します。

Do inlineに明示的にタグ付けしない限り、ヘッダファイル内のclassブロックの外側にメソッド定義を配置します。

しかし、あなたは識別子をアンダースコアで始めるべきではありません。予約済みの識別子はありませんが、最初のアンダースコアを避けるのは良い習慣です。

関連する問題