c++ - 继承的构造函数和附加变量的解决方法

标签 c++ constructor initialization superclass class-variables

我需要一个解决方法或一个好的解决方案来初始化基类和子类中的一堆常量类变量

问题很简单,我得到了一个带有两个构造函数的基类,并且子类中也有两个相同的构造函数

class BASE {
    int a;

    int func(float x) { // just a dummy to show that this function
        return (a = (int) x) + 2; // modifies a
    }
public:
    const int b;

    BASE(const int b) : b(b) {} // doesn't use a
    BASE(const float x) : a(0), b(func(x)) {}
};

struct SUB: public BASE {
    const int c;
    const int d;

    SUB(const int b) : BASE(b), c(b), d(c + 3) {}
    SUB(const float x) : BASE(x), c(b), d(c + 3) {}
};

子类需要从 BASE 调用构造函数来初始化 BASE 中的类变量,然后子类初始化剩余的变量

到目前为止一切顺利,但问题是 SUB 的两个构造函数执行完全相同的操作,除了从 BASE 调用不同的构造函数

我想要类似的东西

    SUB() : c(b), d(c + 3) {} // BASE() needs to be defined
    SUB(const int b) : BASE(b), SUB() {}
    SUB(const float x) : BASE(x), SUB() {}

但这不起作用,因为“对委托(delegate)构造函数的调用应是唯一的成员初始值设定项”...

将所有内容移到初始值设定项列表之外不起作用,因为这些是 const 类变量

最佳答案

您可以为派生类创建“转发构造函数”:

struct SUB: public BASE {
    const int c;
    const int d;

    template <class... T>
    SUB(T&&... a) : BASE(std::forward<T>(a)...), c(b), d(c + 3) {}
};

这将接受任意参数并将它们转发到 BASE 。当然,只有当使用对 BASE 有效的参数调用时,它才会编译。 ,但这适用于所有情况。

如果您想要/需要 super 正确,您可以使用 SFINAE 来调节构造函数,例如 std::is_constructible<BASE, T&&...> ,但我不会打扰。

关于c++ - 继承的构造函数和附加变量的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51320264/

相关文章:

ios - 我不应该使用self-> iVar = some;而不是iVar =我的init中有东西

c++ - 创建 GDI 矩形图像

c++ - 我怎样才能从 QML 中的 cpp 发出的信号中获取参数

c++ - 是否分配给临时对象未定义行为的字段?

java - 在java中初始化对象A等于另一个对象B

ios - 当我们可以将所有内容转储到 awakeFromNib 中时,为什么还要使用 init(coder)?

c++ - 从 Crypto++ 获取随机输出

python - __init__() 内部和外部变量之间的差异(类和实例属性)

c++ - 创建独立于构造函数参数的对象指针

c++ - 如何通过构造函数将容量大小传递给无锁 spsc_queue