質問内容
静的メンバ変数 (table1, table2
) を初期化するための静的メンバ関数 initialize()
があります。
今は「静的メンバ変数にアクセスする前に必ず initialize()
を一度呼ぶこと」としているのですが、使う側が呼び出すのを忘れて、静的メンバ変数にアクセスした場合、エラーになってしまいます。
そのようなことがないように、プログラム起動時 (main()
より前) に自動に initialize()
が呼び出されて、静的メンバ変数を初期化されるようにしたいのですが、そのような方法はありますでしょうか。
よろしくおねがいします。
環境
- C++17
コード
※ 以下のコードでは、メンバ変数の中身がコンパイル時に決定できますが、実際はファイルを読み込んで初期化する処理のため、コンパイル時に中身は決定できません。
cpp
1#include <algorithm> 2#include <iostream> 3#include <vector> 4 5class MyClass 6{ 7public: 8 // プログラム起動時に呼び出してほしい関数 9 static void initliaze() 10 { 11 if (!table1.empty()) 12 return; // 初期化済み 13 14 make_table(table1); 15 make_table(table2); 16 } 17 18 static void make_table(std::vector<size_t> &table) 19 { 20 table.resize(10); 21 for (size_t i = 0; i < 10; i++) 22 table[i] = i; 23 } 24 25 static std::vector<size_t> table1; 26 static std::vector<size_t> table2; 27}; 28 29std::vector<size_t> MyClass::table1; 30std::vector<size_t> MyClass::table2; 31 32int main(int, char **) 33{ 34 MyClass::initliaze(); 35 std::cout << MyClass::table1[3] << std::endl; 36} 37
解決方法
教えていただいた内容をもとに以下のように修正しました。
ご回答ありがとうございました。
cpp
1#include <algorithm> 2#include <iostream> 3#include <vector> 4 5class MyClass 6{ 7public: 8 MyClass() 9 { 10 initliaze(); 11 } 12 13 // プログラム起動時に呼び出してほしい関数 14 static void initliaze() 15 { 16 if (!table1.empty()) 17 return; // 初期化済み 18 19 make_table(table1); 20 make_table(table2); 21 } 22 23 static void make_table(std::vector<size_t> &table) 24 { 25 table.resize(10); 26 for (size_t i = 0; i < 10; i++) 27 table[i] = i; 28 } 29 30 static std::vector<size_t> table1; 31 static std::vector<size_t> table2; 32}; 33 34std::vector<size_t> MyClass::table1; 35std::vector<size_t> MyClass::table2; 36 37static MyClass inst; 38 39int main(int, char **) 40{ 41 std::cout << MyClass::table1[3] << std::endl; 42}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/27 15:10
2020/11/27 15:46 編集
2020/11/27 15:54
2020/11/28 03:54
2020/11/30 06:18
2020/11/30 06:37