【问题标题】:Automatic c++ constructor creation? [duplicate]自动创建 C++ 构造函数? [复制]
【发布时间】:2013-08-04 01:52:01
【问题描述】:

我只是想检查一下:

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

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

【问题讨论】:

  • 也许你应该重新考虑派生类。如果它没有(似乎)增加价值?
  • 我不这么认为...它覆盖了继承方法的逻辑。我不认为这是一件坏事......

标签: c++ inheritance compiler-construction constructor


【解决方案1】:

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

在派生类的定义中写:

public:

  using base_class::base_class;

base_class 是你的基类。

【讨论】:

  • 请注意,这在 Visual Studio 中不可用。
  • 因为它不是 C++11 功能完整的
  • 嗯,这很不幸,因为我使用的是 VS,正如您以某种方式正确猜到的那样......
【解决方案2】:

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

p>
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; }

【讨论】:

  • 不过,这可能更糟。 1/ 随着您添加变异可能性,维护不变量变得越来越困难,而且该类可能没有自然的默认初始化 2/ 所有调用站点现在都必须调用一堆 setX 方法 3/ 而在您获得编译器之前添加新参数时出错,让您有机会找到所有调用站点;现在你什么也得不到。可以说,单个 set 方法(多个参数)可以解决 2/ 和 3/,但是 1/ 不会解决。
  • 可以说,是的。这取决于您在构造时是否真的需要参数。我认为上面的解决方案都更好,但是对于我遇到的一些案例来说,这绝对是一个更干净的解决方案。
【解决方案3】:

这实际上取决于您所针对的 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); };

简单易学。

【讨论】:

  • 好的,好吧...我会提出“Pack”选项,但我问这个问题的原因也是模板使用...我想要一个模板来覆盖某些模板参数指定的类中的方法,但存在一个问题,即所有类都有不同的构造函数,因此我无法创建这样的实例...
猜你喜欢
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多