6

次の意味で、静的メンバー変数MAX_DISTを使用してクラスUtilを定義しようとしています。

class Util{

 public:
    static double MAX_DIST;
    Util():MAX_DIST(400.0){}
};

他のクラスで更新できるようになります。

Util::MAX_DIST = 387.98;

これは私にエラーを与えます:

‘double Util::MAX_DIST’ is a static data member; it can only be initialized at its definition

ただし、MAX_DISTをその定義で初期化すると、

class Util{

 public:
    static const double MAX_DIST = 400;
    Util();
};

(コンパイラの指示に従って「const」を追加する必要があります。そうしないと、「ISO C ++は非const静的メンバーのクラス内初期化を禁止します」というエラーが発生します)現在、MAX_DISTを他の場所で変更することはできません。準備完了のみ:

error: assignment of read-only variable ‘Util::MAX_DIST’

インターネットで無駄な検索をした後、私はこのパラドックスの解決策を見つけることができません。誰かが私を助けることができますか?

4

3 に答える 3

8

これをあなたのUtil.cpp(またはファイル名が何であれ)ファイルに入れてください:

double Util::MAX_DIST = 0;

静的変数を初期化する必要があります。

長い答え、標準を引用9.4.2 $2

クラス定義での静的データメンバーの宣言は定義ではなく、cv修飾void以外の不完全なタイプである可能性があります。静的データメンバーの定義は、メンバーのクラス定義を囲む名前空間スコープに表示されます。名前空間スコープでの定義では、静的データメンバーの名前は、::演算子を使用してそのクラス名で修飾する必要があります。静的データメンバーの定義の初期化子式は、そのクラス(3.3.7)のスコープ内にあります。

于 2012-11-18T18:02:50.070 に答える
3

最初のケースでは、非静的コンテキスト内、つまりコンストラクター内から静的変数を初期化しようとしています。これが間違っていることは正しいです。

2 番目のケースでは、変数を const にしたくありません。代わりに、次のようなステートメントを使用して、クラスの外で宣言する必要があります。

double Util::MAX_DIST = 400;
于 2012-11-18T18:03:26.747 に答える
2

ただし、その定義で MAX_DIST を初期化すると

あなたは定義と 宣言を混同しています。後者で初期化しようとしています - C++ はそれを禁止しています。他の回答は、定義がどのように見えるかを示しています。クラス宣言のにあり、独自のコンパイル単位にある必要があります(そうしないと、ヘッダーを複数のソースファイルに含めようとすると、1 つの定義ルールに違反します)。

元のコードが機能しなかった理由についての一言: 初期化をコンストラクターの初期化リストに入れようとしました。ただし、このコンストラクターはインスタンスごとに呼び出されます。そのコードがコンパイルされたとしても、それは常にあなたの静的変数をリセットします - あなたが望むものではありません.

于 2012-11-18T18:04:35.730 に答える