1

我只想检查一下:

如果我有一个没有新成员的派生类。如果基类已经有一个很长的构造函数(许多参数),那么在派生类中创建构造函数只是将所有参数都扔给基构造函数,这有点无聊(显然不是必需的)过程。有没有办法告诉编译器自动执行它?我想不是,但只需要检查。我还没有找到关于这个主题的任何内容,但如果是这种情况,我仍然很抱歉重复...

//我对IDE自动生成功能不感兴趣(尽管我也欢迎这种类型的建议),只是一个编译器......

4

3 回答 3

3

您可以使用构造函数继承(自 C++11 起可用)

在派生类的定义中写:

public:

  using base_class::base_class;

其中 base_class 是您的基类。

于 2013-08-02T17:37:44.157 回答
2

这实际上取决于您所针对的 C++ 版本。

第一个答案是在 C++11 中很容易:

  • 您可以使用继承构造函数
  • 或完美转发

执行:

// Inheriting
struct D: B { using B::B; };

// Forwarding
struct D: B {
    template <typename... T>
    D(int a, T&&... args): B(std::forward<T>(args)...), _a(a) {}
    int _a;
};

正如所展示的,虽然更冗长的完美前锋也更加通用。


但是,如果您被困在 C++03 中,一切都不会丢失:只需重构基本构造函数,使其需要更少的参数(理想情况下是一个):

// Before
struct B { B(int a, int b, int c, ...); };

// After
struct Pack { Pack(int a, int b, int c, ...); };
struct B { explicit B(Pack p); };

十分简单。

于 2013-08-02T17:42:08.427 回答
0

如果您在基本构造函数中初始化多个参数并且它们的值被传递给构造函数,您可以通过实现setX()函数而不是初始化构造函数中的值来克服这个问题而无需 C++11。

BaseClass::BaseClass(int arg1, int arg2, int arg3, ...) :
    _member1(arg1),
    _member2(arg2),
    _member3(arg3),
    ...
{}

将其更改为:

BaseClass::BaseClass() :
    _member1(0),
    _member2(0),
    _member3(0),
    ...
{}

void BaseClass::setMember1(int value) { _member1 = value; }
于 2013-08-02T17:40:58.033 回答