実現したいこと
とあるクラスAを作り、クラスAを引数として初期化するクラスBを作成しました。
クラスA、Bそれぞれの定数を作成しようとしたところ、クラスBのコンストラクタが実行されてからクラスAのコンストラクタが実行されてしまいました。クラスAのコンストラクタが先に呼ばれるようにするか、根本の構造から見直して正しく動作するようにしたいです。
解決策でなくとも、ここが原因、悪手だという意見でも大変助かります。
該当のソースコード
問題点だけ残して簡素化したプログラムです。クラスA、Bの定義は以下4つのファイルで構成されています。
c++(A.h)
1#pragma once 2 3#include <iostream> 4 5class A 6{ 7public: 8 A(const int&); 9 const int checkNum; 10}; 11 12namespace A_VAR { 13 extern const A ONE, TWO; 14}
c++(A.cpp)
1#include "A.h" 2 3A::A(const int& num): checkNum(num) { 4 std::cout << "A constructor" << std::endl; 5} 6 7namespace A_VAR { 8 const A 9 ONE(1), 10 TWO(2); 11}
c++(B.h)
1#pragma once 2 3#include <iostream> 4#include "A.h" 5 6class B 7{ 8public: 9 B(const A&); 10 const int checkNum; 11}; 12 13namespace B_VAR { 14 extern const B ONE, TWO; 15}
c++(B.cpp)
1#include "B.h" 2 3B::B(const A& A): checkNum(A.checkNum) { 4 std::cout << "B constructor" << std::endl; 5} 6 7namespace B_VAR { 8 const B 9 ONE(A_VAR::ONE), 10 TWO(A_VAR::TWO); 11}
発生している問題・エラーメッセージ
main関数を実行すると以下のようになります。
c++(main.cpp)
1#include <iostream> 2 3#include "A.h" 4#include "B.h" 5 6int main() { 7 std::cout << "main function" << std::endl; 8 9 std::cout << A_VAR::TWO.checkNum << std::endl; 10 std::cout << B_VAR::TWO.checkNum << std::endl; 11 12}
txt(result.txt)
1B constructor 2B constructor 3A constructor 4A constructor 5main function 62 70
A_VAR::TWO.checkNum
とB_VAR::TWO.checkNum
が同じ2
になっていません。原因は、BコンストラクタがAコンストラクタより先に呼ばれていて、クラスAのメンバ変数checkNum
に値が代入されていない状態でクラスBがその値を引き継いでしまっているからだと考えられます。
試したこと
メンバ変数の順番を変えてみたりしましたが手も足も出ませんでした。
補足情報(FW/ツールのバージョンなど)
Windows 11
Visual Studio 2022



回答2件
あなたの回答
tips
プレビュー