c++ - 抽象基类中初始化const成员变量的常用解决方案

标签 c++ inheritance polymorphism

鉴于以下情况

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/

相关文章:

c++ - 需要有关 C++ 指针和字符数组(C 字符串)的建议

java - 在子接口(interface)中声明具有相同声明的通用方法的体系结构重要性是什么

c++ - 在派生类中复制类似构造函数的基类实例复制

C++ : Add a method to a base class interface

c++ - 以下哪一种函数类型不能被重载?

c++ - API 返回类型——将智能指针强加给用户?

c++ - 解决 C++ 对临时对象的非常量引用的限制

c++ - 使用 float 的系列总和

java - 当我可以简单地使用方法覆盖时,为什么要扩展抽象类来更改函数定义?

java - 构造函数是否未绑定(bind)到类的实例?