2

そのため、複雑なプロジェクトを作成しましたが、インクルードファイルが多すぎて頭痛の種になりました。これらのクラスを最適に管理するにはどうすればよいですか?一部のクラスは他のクラスを使用する必要があります。また、intの配列の束を含む.hファイルもあります。これらはアプリケーション全体で同じままですが、コンパイラが配列を再定義していると文句を言うと問題が発生します。

クラスライブラリを作成する必要がありますか?名前空間?DLL?ベストプラクティスは何ですか?正しい方法をどこで見つけることができますか?

4

3 に答える 3

11

file.h

   #ifndef FILE_H_INCLUDED
   #define FILE_H_INCLUDED

   void foo();

   #endif
  • 可能な場合はグローバル変数を避けてください。それらを使用する必要がある場合は、を使用してグローバル変数を宣言しextern、代わりに定義を.cppファイルに配置します。

file.h

   extern int var[20];

file.cpp

   int var[20];
  • 可能であれば、前方宣言を使用してください。クラスへの参照またはポインターのみを使用し、そのポインターを逆参照しない場合は常に、前方宣言を使用できます。

役に立つ.h

   class Useful {};

other.h

   // Forward-declare instead of #include
   class Useful;

   class Other
   {
       Useful* helper;
   };
于 2012-12-27T22:21:58.797 に答える
1

本当にベストプラクティスはないと思います。状況によって異なります。私がお勧めするのは、同じようなオブジェクトを名前空間にグループ化してから、すべての定義を1つの.hファイルに入れることです。実装が短い場合は、それらすべてを1つのcppファイルに入れてください。私の仕事では、このようなデータベースアクセス層があります。ストアドプロシージャによって入力されるオブジェクトは、およそ数十個あります。コードはまだお尻の大きな痛みですが、すべて500行未満の2ダースの.hファイルとcppファイルを使用するよりも優れています。このコメントを実行してオブジェクト定義を区分化すると、非常に重要になります。10,000行を超えるファイルは簡単に取得できるため、ファイルを分割するための何かが必要です。

もちろん、ガードを使用すると、再定義エラーが解決される可能性があります。

于 2012-12-27T22:25:08.733 に答える
0

定義と宣言の違い、およびエンティティのどの用途でエンティティを宣言する必要があるかを知る必要があります。次に、「1つの定義ルール」(ODR)を学習する必要があります。これは、プログラムに複数の定義を含めることが許可されていない場合(したがって、定義をヘッダーに入れることができない場合)とその内容を示します。定義が同一である限り、複数回定義できます(したがって、定義はヘッダーに入れることができます)。

たとえば、宣言している配列。これらはグローバルに表示される配列であるため、プログラムには1つの定義しか含めることができず、したがって、定義をヘッダーに入れることはできません。それらにアクセスする必要があるプログラムのすべての部分は、単にそれらの宣言を知る必要があります。したがって、ヘッダーファイルに定義を入れてODRに違反する代わりに、それらの定義を含むC ++ファイルと、それらの宣言を含むヘッダーを用意する必要があります。

このようなコード:

int foo[100];

配列の宣言と定義の両方foo。このようなコードをC++ファイルに入れます。この配列のみを宣言するには、次のようにします。

extern int foo[100];

このようなコードをヘッダーに入れます。

クラス定義、インライン関数、およびテンプレートはすべて、定義が同一である限り、複数回定義できるものです。これらの定義はヘッダーに入れることができますが、通常の関数とグローバル変数は1回しか定義できないため、ヘッダーで宣言してから実装ファイルで定義します。

于 2012-12-27T22:50:52.357 に答える