如何存储在初始化基类期间获得的派生类信息中?
-
21-12-2019 - |
题
我的情况是,作为初步效果的侧面效果来初始化基类,派生类可以通过其接口来计算必须以后可用的信息。以下提出了问题,使用布尔值作为所需信息:
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;
};
. 不隶属于 StackOverflow