1. ホーム
  2. c++

[解決済み] なぜ、メンバ変数を宣言順に初期化しなければならないのですか?

2023-08-28 19:24:35

質問

今日、いくつかのコードを書いていたところ、奇妙なコンパイルエラーが発生しました。これは、メンバー変数が宣言されたのとは異なる順序で初期化されたことが原因のようです。

例を挙げます。

class Test {
    int a;
    int b;

public:
    Test() : b(1), a(2) {
    }
};

int main() {
    Test test;
    return 0;
}

でコンパイルすると -Werror -Wall :

$ g++ -Werror -Wall test.cpp
test.cpp: In constructor ‘Test::Test()’:
test.cpp:3:9: error: ‘Test::b’ will be initialized after [-Werror=reorder]
test.cpp:2:9: error:   ‘int Test::a’ [-Werror=reorder]
test.cpp:6:5: error:   when initialized here [-Werror=reorder]
cc1plus: all warnings being treated as errors

私は -Wall は明示的にGCCに警告で大げさなことを要求していますが、私はそれらすべてに理由があると仮定します。それで、メンバー変数を初期化する順序はどのように問題になりえますか?

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

理由は、コンストラクタで初期化した順番ではなく、クラスで宣言された順番で初期化されるため、コンストラクタの順番が使われないと警告されるからです。

の初期化でエラーが発生するのを防ぐためです。 b に依存する a に依存しているか、またはその逆です。

この順序の理由は、デストラクタが1つしかなく、クラスのメンバーを破壊するために "逆順" を選択しなければならないからです。この場合、最も簡単な解決策は、クラス内の宣言の順序を使用して、属性が常に正しい逆順で破棄されるようにすることでした。