鉴于以下情况
class Base
{
public:
Base(double par1, double par2)
:
par1_(par1),
par2_(par2)
{}
const double value_;
protected:
const double par1_, par2_;
virtual double Calc_Value() = 0;
};
class Derived_A : public Base
{
public:
Derived_A(double par1, double par2)
:
Base(par1, par2)
{}
protected:
double Calc_Value()
{
// <code to calc value with par1_ and par2_>
}
};
class Derived_B : public Base
{
public:
Derived_B(double par1, double par2, double par3)
:
Base(par1, par2),
par3_(par3)
{}
const double par3_;
protected:
double Calc_Value()
{
// <code to calc value with par1_, par2_ and par3_>
}
};
int main()
{
std::vector<Base*> my_vector;
// do stuff using polymorphism
}
这一直困扰着我一段时间。我想初始化 value_
与 Calc_Value()
创建 Derived_A
的对象时或 Derived_B
.我知道只有 Base
可以初始化它的常量 成员。现在,我的类对象主要是某种容器,它们在创建时计算必要的值。所以它们应该是只读的。我知道我可以制作
value_
不是 常量 ,但这会使它变得可变。我在互联网上找到的大多数解决方案只是在 Base
中创建一个额外的构造函数。但是我必须声明par3_
在基类中,这意味着,每次都有一个 derived_A
对象将有 par3_
成员变量,而从未使用过它。另外,假设我想要更多具有不同 Calc_Value()
的派生类函数,然后我是否需要为每个额外的子类声明一个构造函数?到目前为止,我已经通过制作 Calc_Value()
克服了这个问题。功能 公众 因此不需要 公共(public)常量 成员变量。但是当通过函数访问对象时,我认为圆括号会降低可读性,这就是我想要 的原因。常量 Base
中的成员变量.这个问题有一个通用的解决方案吗?
最佳答案
你可以有一个 const double&
在您的基类中并将 double 存储在您的派生类中。像这样的东西。
#include <iostream>
struct Foo {
Foo(const double& ref) : value(ref) {}
const double& value;
};
struct Bar : Foo {
Bar(const double p1, const double p2) : Foo (value), value(p1 + p2) {}
private:
double value;
};
int main() {
Bar b(5, 3);
Foo* f = &b;
std::cout << f->value;
}
这里Bar
允许修改value
, 但由于 Base
有一个 const ref 你不能使用引用修改值。如果您需要
Bar::value
成为 const
同样,您需要在构造函数初始化程序列表中对其进行初始化。如果您还需要一个函数来计算该值,则它不能是成员函数,因为在构造对象之前您不能调用成员函数。在这种情况下,您可以制作
Calc_value
一个静态成员函数,并从 Bar
的构造函数传递它所需的参数struct Bar : Foo {
Bar(const double p1, const double p2) : Foo (value), value(Calc_value(p1, p2)) {}
private:
static double Calc_value(const double p1, const double p2) {
return p1 + p2;
}
double value;
};
看起来你只是为了避免编写 ()
让你的代码有点过于复杂在此刻。
关于c++ - 抽象基类中初始化const成员变量的常用解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64079194/