基本クラスを初期化するためのデータを考え出すことの副作用として、派生クラスが、後でそのインターフェイスを介して利用できるようにする必要がある情報を計算するという状況があります。以下は、必要な情報としてブール値を使用して、問題のアイデアを示しています。
class base {
public:
base(some_initialization_data);
// ...
};
class derived : public base {
public:
derived()
: base(calc_init_data())
{
}
bool condition_x_occurred() const
{
// How to get at the information obtained
// during the call to calc_init_data()?
}
private:
static some_initialization_data calc_init_data()
{
// This piece of information will later be needed:
const bool condition_x_occurred = /* ... */;
return some_initialization_data(condition_x_occurred);
}
};
これに関する問題は、派生クラスの独自のデータ メンバーが初期化される前に、基底クラスの初期化中に重要な情報が計算されることです。したがって、派生クラスのデータ要素にはまだ書き込んではいけません。過去 20 年間に遭遇したどのプラットフォームでも、まだ正式に作成されていないブール値を使用できると確信していますが、未定義の動作を呼び出すことは避けたいと思います。
問題の情報は基本クラスとはまったく関係がないため、基本クラスに格納することはできません。また、情報を静的データ メンバーに格納することはできません。これを実行できるようにコードをリファクタリングする方法についていくつかのアイデアがありますが、思いついたものはすべて、このような小さな問題には非常に邪魔に思えます。それで、あなたの誰かが何か簡単なことを思いつくことができるのだろうか?
注: 組み込みプラットフォームを使用しているため、GCC 4.1.2 に固執しています。厳密には C++03 (TR1 を含む) ですが、C++11 はありません。