Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我能做些什么,使超构造函数的参数隐式传递吗?_C++_Oop_Inheritance_Constructor - Fatal编程技术网

C++ 我能做些什么,使超构造函数的参数隐式传递吗?

C++ 我能做些什么,使超构造函数的参数隐式传递吗?,c++,oop,inheritance,constructor,C++,Oop,Inheritance,Constructor,我遇到的情况是,顶级类需要一个参数,而所有子类都不需要。某些类别: class SuperClass { public: SuperClass(const int parameter); } 这是我的孩子: class NoParametersInConstructorClass : public SuperClass { public: // This will cause an error: // error: no matching function for ca

我遇到的情况是,顶级类需要一个参数,而所有子类都不需要。某些类别:

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);

当然,如果没有办法,也没有办法,但是有办法吗?

如果您的问题是您有一组特定的子类,所有这些子类都需要使用相同的默认参数调用
超类
构造函数,那么您所需要做的就是引入一个没有参数构造函数的中介体,它将调用带有幻数的
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'.
};

所有派生类都必须向基类传递一些值。派生类很容易在
protected
部分的基类中有一个默认构造函数。可以初始化对派生类有意义的基类的成员数据

class SuperClass {
  public:
    SuperClass(const int parameter);
  protected:
    SuperClass() : SuperClass(10) {} // Delegate to the other constructor.
}

您可能需要更改默认的子构造函数:

class NoParametersInConstructorClass : public SuperClass {
public:
    NoParametersInConstructorClass(int n =0) : SuperClass(n)someText("Hello") {};
 private:
    std::string someText
}
class NoParametersInConstructorClass : public SuperClass {
public:
    using SuperClass::SuperClass;
    NoParametersInConstructorClass() : someText("Hello") {};
private:
    std::string someText
}

通过这种方式,
无参数构造函数或类变量(66)
无参数构造函数类变量将起作用。

要回答您编辑的问题: 您可以使用
using
关键字使派生类使用基类构造函数:

class NoParametersInConstructorClass : public SuperClass {
public:
    NoParametersInConstructorClass(int n =0) : SuperClass(n)someText("Hello") {};
 private:
    std::string someText
}
class NoParametersInConstructorClass : public SuperClass {
public:
    using SuperClass::SuperClass;
    NoParametersInConstructorClass() : someText("Hello") {};
private:
    std::string someText
}

您必须以某种方式为派生类定义构造函数。如果没有
using
语句,您不能只调用派生类的基类构造函数。

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

您能给我们看一下您的实际代码吗?子类似乎不继承基类,所以我不确定是否理解您的问题。如果您想这样做,可以在子类中显式调用超类构造函数
超类(5)
。假设您的子类继承自需要参数的基类,那么在不给它参数的情况下,您希望如何调用它的构造函数?编译器应该使用随机数吗?@JameyD很抱歉,我刚刚忘记编写
:公共超类
。我目前正在使用显式调用。我的实际代码与您看到的代码几乎相同,只是名称是
Graph
BigGraph
和sevelar类似,参数是
GraphData*
。因此,我想不需要再看到任何实际的代码了。您只需从基类构造函数中删除参数,并在该基类构造函数中使用一个常量,这样每个派生类也会使用一个常量。但是,如果每个派生类的参数需要不同,那么就没有其他方法了。听起来像是坏继承。派生类真的满足多态性的is-a要求吗?如果基类真的需要这个参数,那么子类怎么能忽略它呢?