C ++プログラムのどこにグローバル定数を配置する必要がありますか?

c++ global-variables
C ++プログラムのどこにグローバル定数を配置する必要がありますか?

C ++アプリケーションのどこにグローバル定数を配置しますか? たとえば、それらをクラスに入れますか? 構造体で?

  15  5


ベストアンサー

単一のクラスにあまり強く関連付けられていないグローバル定数に名前空間を使用します。 後者の場合、それらをそのクラスに入れます。

_Really_グローバル(アプリケーションレベル)定数は、アプリケーションの名前空間に存在する必要があります(アプリケーションが本来の名前空間内にある場合)。 モジュールレベルの定数の場合、モジュール自体の名前空間が自然な場所です。

13


最善のアプローチは、それらが属する同じネームスペースに配置することです。 通常、大規模なC ++アプリケーションには多くのモジュールがあり、それぞれに独自の定数セットがあります。 各モジュールは名前空間内にある必要があり、その中に定数も含まれている必要があります。

5


単一の.cppファイルに対してローカルな定数の場合、次のような匿名の名前空間で宣言するのが最善の方法です。

namespace {
   int const seconds_per_minute = 60;
   int const minutes_per_hour   = 60;
}

プログラム全体に表示する必要がある定数の場合、最も簡単な解決策は、それらの名前付きの名前空間を作成し、ヘッダーファイルに配置することです。

それらに関連する操作がある場合(またはある場合)、代わりに、おそらくそれらに対してhttp://en.wikipedia.org/wiki/Singleton_pattern[singleton class]を作成する必要があります。 たとえば、私のプログラムには、設定ファイルまたはレジストリなどから起動時定数(IPアドレスなど、ハードコーディングしたくないもの)を読み取る「configuration」という名前のシングルトンクラスがあることがよくあります。そのような。

2


簡単な経験則として、私はそれらを刺激的なCスタイルのプレフィックスを持たない場所に配置します。

したがって、たとえば、定数の名前が mylib_foo、` mylib_bar`の場合、それらは名前空間mylibにあり、 `mylib

foo`と` mylib :: bar`でなければなりません。

名前空間mylibに定数 circle_max_radius、` sphere_max_radius`、 rectangle_max_width、` rectangle_max_height`が含まれる場合、Circle、Sphere、およびRectangleはクラスであり、それらは静的クラスメンバーでなければなりません。

「max」は「刺激的な」接頭辞ではありません。所有格(「最大半径_of a_ circle」)ではなく説明的な修飾子であるため、非常に賢明な接頭辞です。 だからそれはとどまることができます。

1


可能な方法の1つは、定数を返す静的メンバー関数を持つクラスです。 これは、基本型または単純なオブジェクト以上の定数が必要なときに使用します。

class Constant
{
public:
     static const ComplexObject& getComplexObject()
     {
          static ComplexObject constObj = createComplexObject();
          return constObj;
     }
private:
     static ComplexObject createComplexObject()
     {
         ComplexObject obj;
         obj.setValue(1);
         return obj;
     }
}

1


1つのオプションは、それらを非静的メンバーとしてクラスに入れ、そのタイプのオブジェクトをmain()関数内に置くことです。 これにより、理由を問わず、必要なことがわかったときにそれらを非グローバルにすることが簡単になります。

0


タイトルとURLをコピーしました