我有这样的情况,作为提出数据来初始化基类的副作用,派生类计算了一条信息,该信息以后必须通过其接口可用。下面给出了问题的一个概念,使用布尔值作为所需的信息:
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。