我是否可以做点什么,以便将参数隐式传递给超构造函数

Can I do something so that arguments to superconstructor are passed implicitly?

本文关键字:构造函数 参数 是否 什么      更新时间:2023-10-16

我遇到一种情况,即顶级类需要一个参数,而没有一个子类需要。一些类:

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 语句。

假设你不能(或者你不会)修改基类来添加默认构造函数,你必须在每个派生类的初始化列表中以有效形式(带参数)调用基类的构造函数(像这里一样)