2

ヘッダファイルでクラスの関数を定義するのが悪い習慣なのはなぜですか?

ヘッダーファイルがあり、クラス定義自体でクラスの関数を次のように定義するとします。

ヘッダファイル.hpp

#ifndef _HEADER_FILE_
#define _HEADER_FILE_

class node{
int i;

public:
int nextn(){
......
return i;
}
}

#endif //_HEADER_FILE_

したがって、このようにクラスで関数を定義すると、関数は「インライン」になります。したがって、このヘッダー ファイルをたとえば 2 つの .cpp ファイルに含めると、「複数定義エラー」が発生しますか??のような関数を定義するのは悪い習慣ですか?これはクラス定義ですか?

4

4 に答える 4

1

プロトタイプ (つまり、クラス、その関数、およびそれらの型の宣言) を実装から分離する規則は、設計とパフォーマンスの両方の観点から生まれました。

  • 従属オブジェクトの型チェックとコンパイルは安価です。クラスを使用するものは、実装を知らなくても安全にコンパイルできます。

  • コンパイラは、依存関係をコンパイルするたびに、同じ情報を何度も解析して再コンパイルする必要はありません。

問題は、C++ でファイルの先頭に記述することの実際の意味を覚えておくこと#includeです。これは、「他のファイルのすべての内容を取得して、ここに配置する」ことを意味します。したがって、コード ベース全体の多くの場所でクラスを使用している場合、クラスは毎回解析され、そのコンパイル ユニットのコンテキストで再コンパイルされます。

これがまさに、テンプレートクラスの実装をヘッダー ファイルにインラインで配置する必要ある理由です。コンパイラは、異なるテンプレートのインスタンス化ごとにクラスを再解析してコンパイルする必要があります (それがテンプレートの目的であるため)。

質問に直接答えるには: * いいえ、複数定義エラーは発生しません。* たぶん、デザインの観点からそれを練習に戻したと考える人もいるでしょう(そうでない人もいます)上記の場合でも、ヘッダーのみのライブラリをコンパイルする方が高速な場合があります。

実装が長く、クラスがコードベースで頻繁に使用され、頻繁に変更される可能性がある場合は、おそらくこれを行うことは避けてください。

さらに読むには、「プリコンパイル済みヘッダー」を調べる価値があるかもしれません。

于 2013-09-28T10:22:10.830 に答える
0

hpp ファイルで (インライン) 関数を定義することは合法です。「inl.hpp」のような専用の拡張子の下で収集することを好む人もいますが、これは単なるスタイルの好みです。

于 2013-09-28T08:24:31.137 に答える