web-dev-qa-db-ja.com

ヘッダーファイルでconst static std :: stringをどのように定義できますか?

静的なstd::stringを保存したいクラスがあり、それは本当にconstであるか、ゲッターを介して効果的にconstです。

私はいくつかの直接的なアプローチを試しました
1。

const static std::string foo = "bar";

2。

const extern std::string foo; //defined at the bottom of the header like so 
...//remaining code in header
};  //close header class declaration
std::string MyClass::foo = "bar"
/#endif // MYCLASS_H

私も試しました

3。

protected:
    static std::string foo;
public:
    static std::string getFoo() { return foo; }

これらのアプローチは、それぞれ次の理由で失敗します。

  1. エラー:非リテラル型の静的データメンバーconst string MyClass::fooのクラス内初期化
  2. fooに指定されたストレージクラス-externconstまたはstaticを組み合わせるのは好きではないようです
  3. コードの他の部分、およびゲッター関数の戻り行によって生成される多くの「未定義の参照」エラー

理由ソースファイルではなくヘッダー内に宣言を含めたい。これは拡張されるクラスであり、他のすべての関数は純粋に仮想なので、現在、これらの変数以外にソースファイルを持つ理由はありません。

それでは、これをどのように行うことができますか?

14
user1854496

1つの方法は、内部に静的変数を持つメソッドを定義することです。

例えば:

class YourClass
{
public:

    // Other stuff...

    const std::string& GetString()
    {
        // Initialize the static variable
        static std::string foo("bar");
        return foo;
    }

    // Other stuff...
};

これは静的文字列を1回だけ初期化し、関数を呼び出すたびに変数への定数参照を返します。あなたの目的に役立ちます。

16
Chris Cooper

整数型のコンストラクターで静的const値のみを初期化でき、他の型は初期化できません。

ヘッダーに宣言を入れます。

const static std::string foo;

そして、定義を.cppファイルに入れます。

const std::string classname::foo = "bar";

初期化がヘッダーファイル内にある場合、ヘッダーファイルを含む各ファイルには静的メンバーの定義があります。変数を初期化するコードが複数の.cppファイルで定義されるため、リンカーエラーが発生します。

13
Yu Hao