自动c ++构造函数创建?

时间:2013-08-02 17:33:49

标签: c++ inheritance compiler-construction constructor

我只是想检查一下:

如果我有一个没有新成员的派生类。如果基类已经有一个很长的构造函数(很多参数),那么在派生类中创建构造函数只会将所有参数抛出到基础构造函数中,这有点过于枯燥(显然不是必需)的过程。有没有办法告诉编译器自动执行?我想不是,但只需要检查。我还没有找到关于这个主题的任何内容,但如果是这样的话,我仍然感到抱歉...

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

3 个答案:

答案 0 :(得分:3)

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

在派生类的定义中写:

public:

  using base_class::base_class;

其中base_class是你的基类。

答案 1 :(得分: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); };

Easy Peasy。

答案 2 :(得分: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; }