我是否可以做点什么,以便将参数隐式传递给超构造函数
Can I do something so that arguments to superconstructor are passed implicitly?
我遇到一种情况,即顶级类需要一个参数,而没有一个子类需要。一些类:
class SuperClass {
public:
SuperClass(const int parameter);
}
而且是孩子:
class NoParametersInConstructorClass : public SuperClass {
public:
// This will cause an error:
// error: no matching function for call to 'SuperClass::SuperClass(const int)'
NoParametersInConstructorClass() : someText("Hello") {};
private:
std::string someText
}
现在我面临的问题是我确实有一个初始值设定项列表,但我发现重写所有子类中的参数很乏味。我知道我很懒。我希望这可以在没有明确定义的情况下工作:
// Works even though NoParametersInConstructorClass(const int) isn't defined
NoParametersInConstructorClass variable(66);
当然,如果没有办法,就没有办法,但是有吗?
所有派生类都必须将一些值传递给基类。派生类很容易在 protected
部分中的基类中具有默认构造函数。可以初始化对派生类有意义的基类的成员数据。
class SuperClass {
public:
SuperClass(const int parameter);
protected:
SuperClass() : SuperClass(10) {} // Delegate to the other constructor.
}
如果你的
问题是你有一组特定的子项,所有这些子项都需要使用相同的默认参数调用SuperClass
构造函数,您需要做的就是引入一个带有无参数构造函数的中介,它将使用幻数调用SuperClass::SuperClass
。
将参数设为默认值。
class SuperClass {
public:
SuperClass(const int parameter = DEFAULT);
}
然后,可以选择将构造函数包含在初始化列表中,或使用默认值。
默认值:
class NoParameterChildDefault : public SuperClass
{
public:
NoParameterChildDefault() : someText("Hello") { ... } // uses value DEFAULT.
};
显式值:
class NoParameterChildExplicit : public SuperClass
{
public:
NoParameterChildExplicit() : SuperClass(5), someText("Hello") { ... } // uses value '5'.
};
您可能希望更改默认的子构造函数:
class NoParametersInConstructorClass : public SuperClass {
public:
NoParametersInConstructorClass(int n =0) : SuperClass(n)someText("Hello") {};
private:
std::string someText
}
这样NoParametersInConstructorClass variable(66);
和NoParametersInConstructorClass variable;
都可以工作。
要回答您编辑的问题:可以使用 using
关键字使派生类使用基类构造函数:
class NoParametersInConstructorClass : public SuperClass {
public:
using SuperClass::SuperClass;
NoParametersInConstructorClass() : someText("Hello") {};
private:
std::string someText
}
您必须以某种方式为派生类定义一个构造函数。不能只调用派生类的基类构造函数而不调用 using
语句。
假设你不能(或者你不会)修改基类来添加默认构造函数,你必须在每个派生类的初始化列表中以有效形式(带参数)调用基类的构造函数(像这里一样)
相关文章:
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 在按值调用 (c++) 中转发构造函数参数
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 如何在构造函数参数中初始化"std::set"?
- 何时应在构造函数参数中使用 const C++?
- 使用模板化结构作为构造函数参数
- 使用 lambda 作为构造函数参数是否需要C++ 17?
- 如何使输入文本文件成为构造函数参数?c++
- shared_ptr构造函数参数是否应按值传递
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- 复制构造函数参数为0
- 用作成员构造函数参数的函数的求值顺序
- 结构中的默认成员值或默认构造函数参数
- C++将引用成员绑定到构造函数参数
- 如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?
- 模板函数指针参数与构造函数参数
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 如何基于构造函数参数模板化类成员函数的代码
- 将派生类构造函数参数传递给受保护的成员
- 如何根据构造函数参数使用超类类型初始化成员变量?