1. ホーム
  2. c++

[解決済み] C++のクラスで静的変数を初期化する?

2023-02-10 02:58:20

質問

あるクラスの関数が、実はオブジェクトにアクセスしていないことに気がつきましたので、それらを static . するとコンパイラは、それらがアクセスするすべての変数も静的でなければならないと教えてくれました - まあ、ここまではかなり理解できます。私は以下のような文字列変数をたくさん持っています。

string RE_ANY = "([^\\n]*)";
string RE_ANY_RELUCTANT = "([^\\n]*?)";

といった具合にクラス分けしています。その後、それらをすべて static const にしています。しかし、私のプログラムは、それらをクラスから移動させた場合のみコンパイルされます。そうしないと、MSVC++2010 は "静的定数積分変数のみがクラス内で初期化される可能性があります" と警告します。

それは残念です。回避策はあるのでしょうか。私は、それらを所属するクラス内に残しておきたいと思います。

どのように解決するのですか?

クラス内部で初期化することはできませんが、クラス外部のソースファイルで初期化することができます。

// inside the class
class Thing {
    static string RE_ANY;
    static string RE_ANY_RELUCTANT;
};

// in the source file
string Thing::RE_ANY = "([^\\n]*)";
string Thing::RE_ANY_RELUCTANT = "([^\\n]*?)";

更新

質問の最初の行に気づきました - あなたは don't は、これらの関数を static を作りたいのであれば const . それらを作る static にすることは、それらがもはやオブジェクトと関連付けられていないことを意味します(したがって、それらは非静的なメンバーにアクセスすることができません)、そしてデータを静的にすることは、それがこのタイプのすべてのオブジェクトで共有されることを意味します。これは、あなたが望むものではない可能性があります。それらを const にすることは、どのようなメンバーも変更できないが、アクセスは可能であることを意味します。