静的な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; }
これらのアプローチは、それぞれ次の理由で失敗します。
const string MyClass::foo
のクラス内初期化foo
に指定されたストレージクラス-extern
とconst
またはstatic
を組み合わせるのは好きではないようです理由ソースファイルではなくヘッダー内に宣言を含めたい。これは拡張されるクラスであり、他のすべての関数は純粋に仮想なので、現在、これらの変数以外にソースファイルを持つ理由はありません。
それでは、これをどのように行うことができますか?
1つの方法は、内部に静的変数を持つメソッドを定義することです。
例えば:
class YourClass
{
public:
// Other stuff...
const std::string& GetString()
{
// Initialize the static variable
static std::string foo("bar");
return foo;
}
// Other stuff...
};
これは静的文字列を1回だけ初期化し、関数を呼び出すたびに変数への定数参照を返します。あなたの目的に役立ちます。
整数型のコンストラクターで静的const値のみを初期化でき、他の型は初期化できません。
ヘッダーに宣言を入れます。
const static std::string foo;
そして、定義を.cppファイルに入れます。
const std::string classname::foo = "bar";
初期化がヘッダーファイル内にある場合、ヘッダーファイルを含む各ファイルには静的メンバーの定義があります。変数を初期化するコードが複数の.cppファイルで定義されるため、リンカーエラーが発生します。