继承构造函数和其他变量的解决方法
Workaround for inherited constructor and additional 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() {}
但这不起作用,因为"对委托构造函数的调用应该是唯一的成员初始值设定项"。。。
将所有内容移出初始值设定项列表是不起作用的,因为这些都是常量类变量
您可以为派生类创建一个"转发构造函数":
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
有效的参数调用时才会编译,但这适用于所有情况。
如果你想/需要超级正确,你可以在std::is_constructible<BASE, T&&...>
之类的东西上使用SFINAE来调节构造函数,但我不介意。
不幸的是,这是语言的规则,如果您有一个委托构造函数,它必须是初始值设定项列表的唯一部分。
您需要绕过这个限制,例如通过复制默认的构造函数初始值设定项列表:
SUB(const int b) : BASE(b), c(b), d(c + 3) {}
相关文章:
- 有没有办法在 c++ 中同时生成随机数?如果没有,是否有解决方法?
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- 是否有解决方法可以在 c++ 中为 short 定义用户定义的文字?
- 不为 emplace() 定义构造函数的解决方法
- 删除复制构造函数的 Intel 13.1.2 中不良C++行为的解决方法
- 函数模板部分专业化-有什么解决方法吗
- 带boost的过载模糊性:可选,解决方法
- 继承构造函数和其他变量的解决方法
- C++ 解决方法:"从类型"B*"的表达式初始化类型"C*&"的引用无效"
- 对前向声明类型进行unique_ptr的解决方法
- 解决方法:'can not be used when making a shared object; recompile with -fPIC'使用Cmake。使用普通的 g++ 工作
- 解决方法:QPixmap:在GUI线程之外使用pixmap是不安全的
- CreateProcessWithTokenW 的 cmdline 参数的最大长度是否有解决方法?
- C++双精度作为模板参数的解决方法
- 在参数相关查找之前进行模板替换的任何方法(或解决方法?
- CUDA 内核"Only a single pack parameter is allowed"解决方法?
- dlsym() 解决方法返回类型
- VS2017是否有VLA(可变长度阵列)支持解决方法
- 解决方法:未定义对"class::function"的引用
- 来自 Boost 的 JSON 解析器的警告 C4512 的解决方法