メンバー関数をプログラミングするときのより良い方法は何ですか?
-
03-07-2019 - |
質問
クラス内およびクラス外の両方でプログラムされたメンバー関数を、クラス内の関数プロトタイプで見ました。最初の方法を使用してプログラムしたことがありますが、他の方法を使用する方が良いのか、それとも個人的な好みを使用する方が良いのか疑問に思っていましたか?
解決
C ++を意味すると仮定すると、クラスの関数を外部に定義することをお勧めします。これをクラス内に配置すると、コンパイラーがインライン化を試みることがあるためです。 / p>
- コードサイズの増加(このヘッダーを含むすべてのオブジェクトファイルは、コード内の関数のコピーで終わる可能性があります)。
- 関数定義が変更されたときにバイナリ互換性を破る。
インライン関数であっても、関数が些細なアクセサーまたは他のワンライナーでない限り、クラスパブリックインターフェイスの読みやすさを向上させるために、クラスの外側に定義を置く方が良いです。
>他のヒント
C ++の場合、メソッド定義をヘッダーファイルに置くことは、特定のヘッダーを含むすべてのものが、ヘッダーが変更されたときに再コンパイルする必要があることを意味します。
ヘッダーから定義を削除すると、ヘッダーを含むファイルを再コンパイルする必要があるのは、ヘッダー自体が変更された場合(関数の追加/削除、または宣言の変更)のみです。これは、複雑なプロジェクトのコンパイル時間に大きな影響を与える可能性があります。
両方の手法には利点があります。
クラス定義にプロトタイプのみを配置すると、クラスを使用している人が使用可能なメソッドを簡単に確認できるようになります。実装の詳細に気を取られることはありません。
コードをクラス定義に直接配置すると、クラスの使用が簡単になり、ヘッダーを#includeするだけで済みます。これは、テンプレートクラスで特に便利です(必要)。
言語がC ++であると仮定:
要点は、個人的な好みです。クラス内は全体的に短く、より直接的です。特に
int getFoo() const { return _foo; }
関数のタイプ。 クラス外では、「クラッタ」を削除できます。クラス定義から。
使用中の両方を見ました...
もちろん、非インライン関数は常にクラスの外にあります。
クラスを定義するときに両方のスタイルを混在させることも一般的です。 1行または2行で構成される単純なメソッドの場合、クラス定義内でメソッド本体を定義するのが一般的で便利です。より長いメソッドの場合、これらを外部で定義することをお勧めします。メソッド本体で混乱することなく、より読みやすいクラス定義が得られます。
メソッドの実装を非表示にすることは、クラスのユーザーが実際の実装に気を取られたり、後で変更される可能性のある実装について推測したりしないという点で有益です。
C ++について話していると思います。
きれいできれいなインターフェースを持つことは確かに良い考えです。個別の実装ファイルを用意しておくと、インターフェイスをきれいに保つことができます。
また、特に不透明ポインターを使用している場合、コンパイル時間も短縮されます。
クラス内に関数を実装する場合、クラスを複数の.cppファイルに#includeすることはできません。そうしないと、リンカーは関数の複数の定義について文句を言います。
したがって、通常は、クラス定義を.hファイルに、メンバー実装を.cppファイルに(通常は同じ名前で)作成します。
また、C ++を想定して、私は通常これを仮想関数のプレースホルダーに制限します。例:
virtual int MyFunc() {} // Does nothing in base class, override if needed
その他、Andrew Medicoの主張はあまりにも簡単に発動し、コンパイル時間を傷つけます。