如何在派生类中存储基类初始化期间获得的信息
How can I store in a derived class information obtained during initialization of a base class?
我遇到的情况是,作为初始化基类的数据的副作用,派生类计算一段信息,这些信息稍后必须通过其接口提供。以下给出了问题的概念,使用布尔值作为所需信息:
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。
在C++11中,您可以执行以下操作:
class derived : public base {
public:
derived() : derived(calc_init_data()) {}
bool condition_x_occurred() const { return my_condition_x_occurred; }
private:
derived(const std::pair<bool, some_initialization_data>& p) :
base(p.second), my_condition_x_occurred(p.first)
{}
static std::pair<bool, some_initialization_data> calc_init_data()
{
// This piece of information will later be needed:
const bool condition_x_occurred = /* ... */;
return std::make_pair(condition_x_occurred, some_initialization_data(condition_x_occurred));
}
private:
bool my_condition_x_occurred;
};
在C++03中,您可以将派生类更改为类似的类
class derived : public base {
public:
static derived make_derived() { return derived(calc_init_data()); }
bool condition_x_occurred() const { return my_condition_x_occurred; }
private:
derived(const std::pair<bool, some_initialization_data>& p) :
base(p.second), my_condition_x_occurred(p.first)
{}
static std::pair<bool, some_initialization_data> calc_init_data()
{
// This piece of information will later be needed:
const bool condition_x_occurred = /* ... */;
return std::make_pair(condition_x_occurred, some_initialization_data(condition_x_occurred));
}
private:
bool my_condition_x_occurred;
};
如果在编译器上可用,您可以使用委托构造函数:
struct derived_init
{
bool data;
some_initialization_data calc()
{
data = true;
return some_initialization_data();
}
};
class derived : public base {
public:
derived()
: derived(derived_init{})
{ }
bool condition_x_occurred() const
{
return init_data.data;
}
private:
derived(derived_init init)
: base(init.calc()), init_data(init)
{ }
derived_init init_data;
};
使用C++03,您可以使用默认参数:
class derived : public base {
public:
derived(derived_init init = derived_init{})
: base(init.calc()), init_data(init)
{
}
private:
derived_init init_data;
};
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 在C和C++中初始化结构中的数组
- 为什么'getline'初始化信息?
- 如何在派生类中存储基类初始化期间获得的信息
- 超类需要比初始化列表提供的信息更多的信息