あるモジュール内のサブモジュール群が依存性で絡んでいたりするときに、正しくない初期化順序を検知できると安心できると考えているのですが、静的に行う良い方法はありますでしょうか。
以下のような場合を考えています。(疑似コードですいません)
C++
1 2class SubModule1 {...}; 3class SubModule2 {...}; // SubModule1に依存 4class SubModule3 {...}; // SubModule1・SubModule2に依存 5 6class MyClass{ 7 SubModule1 sub1; 8 SubModule2 sub2; 9 SubModule3 sub3; 10public: 11 MyClass(){ 12 sub1.init(); 13 sub2.init(sub1); // sub1を用いて初期化 14 sub3.init(sub1, sub2); // sub1とsub2を用いて初期化 15 } 16}; 17
例えば上記のようなコードがあったときに、うっかりMyClassのコンストラクタを
C++
1sub2.init(sub1); // sub1を用いて初期化(アウト、sub1はまだ初期化されていない) 2sub1.init(); 3sub3.init(sub1, sub2); // sub1とsub2を用いて初期化
という風に書いてしまったとき、これをエラーにしたいのです。
すぐに思いつく方法としては、各SubModuleに初期化フラグを持たせ、依存先のモジュールを利用する時は初期化フラグを確認するといった方法が考えられますが、これは動的な検知方法になります。
C++
1 2class SubModule1 {...}; 3 4class SubModule2 { 5 void init(SubModule1& sub1){ 6 if(!sub1.isInit()){ 7 throw exception("sub1 not initialized"); 8 } 9 ... //初期化処理 10 } 11 ... 12}; 13 14class SubModule3 { 15 void init(SubModule1& sub1, SubModule2& sub1){ 16 if(!sub1.isInit() || !sub2.isInit()){ 17 throw exception("sub1 or sub2 not initialized"); 18 } 19 ... //初期化処理 20 } 21 ... 22};
初期化の順序はMyClassのコンストラクタのコードという静的な要素のみで決まるはずなので、だったら静的に判断してstatic_assertなどでエラーにできたら「コンパイルが通る=正しいコード」という安心感が得られる上、実行時の初期化確認のコストもゼロになってとても便利だと思うのですが、そういういい方法はC++には無いものでしょうか。
上記のような動的な検知をデバッグビルドで行い、リリースビルドで削除するような手が最善なのでしょうか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/14 06:36 編集