【问题标题】:Sort of copy constructor of derived class with base class parameter具有基类参数的派生类的复制构造函数的排序
【发布时间】:2021-03-07 08:32:42
【问题描述】:

所以我想为我的派生类创建一个构造函数,我给它一个基类的实例,这样我的基类就使用输入参数进行初始化,而我的派生类遵循默认构造函数。 我想出了这个(MWE):

class Derived : public Base {
Derived(){a = 0; b=3;};
Derived(Base * base): Base(*base),Derived(){};
int a;
int b;
}

但这给了我错误error: constructor delegation follows mem-initializer for 'Base'

那么我该怎么做呢?我知道一种可行的方法,但我想问是否有更好的方法,使我在默认构造函数和另一个构造函数中没有相同的代码。

所以我知道这是可行的:

class Derived : public Base {
Derived(){a = 0; b=3;};
Derived(Base * base): Base(*base){a = 0; b=3;};
int a;
int b;
}

【问题讨论】:

  • 你的类被称为Derived,但看起来你没有任何继承...你的意思是定义它为class Derived: public Base {吗?
  • 是的,我做到了。抱歉,我会编辑问题
  • 复制构造函数的参数应该是const Base&
  • Derived 只有private 成员,Base 的定义可能是相关的。如果只有struct Base {}; 足以重现错误,您可以添加
  • 好吧,也许名称复制构造函数具有误导性。我想要一种复制构造函数。有了你的建议@YaroslavStetsyk,我仍然会遇到同样的问题。 (虽然没试过)

标签: c++ constructor derived-class


【解决方案1】:

构造函数定义的一件事是如何初始化成员和基。 All 非委托构造函数显式或隐式地为 all 成员和基类定义初始化器。您的零参数 Derived 构造函数,例如,默认构造 Baseab;在更惯用的编写版本 Derived() : a(0), b(3) {} 中,它将默认构造 Base 并分别使用 0 和 3 初始化 ab

所以像Derived(...) : Base(foo), Derived(bar) 这样的东西正试图同时拥有它。它试图使用其他一些构造函数的初始化器,同时替换其他的。但这不是委托构造函数的设计目的。委托构造函数使用添加另一个构造函数的活动;它不会修改它。

一般的习惯用法是让构造函数委托给更显式的构造函数。在这种情况下,听起来 ab 的默认值为 0 和 3 通常可以通过委托给直接设置它们的构造函数来完成。这取决于您通过接受指向基类的指针来尝试完成什么。这很奇怪,而且可能不好。

最后,我应该说,虽然委托构造函数不能通过委托构造函数进行修改,但默认成员初始值设定项可以被显式初始值设定项替换。如果您只是在类定义中初始化int a=0, b=3,则每个(非委托)构造函数都可以决定是否保留这些默认值或是否替换其中的一些。

【讨论】:

    【解决方案2】:

    问题是,Derived(...):Derived(){};调用默认的Base 构造函数。因此,向Base 的构造函数添加额外的调用会使编译器感到困惑——它应该如何知道你想要什么?

    如果你想避免代码重复,你可以这样写:

         class Derived : public Base 
         {
            public:
            Derived()=default;
            Derived(Base * base): Base(*base){};
            int a = 0;
            int b = 3;
          }
    

    【讨论】:

      猜你喜欢
      • 2018-09-24
      • 1970-01-01
      • 2022-01-17
      • 2021-02-14
      • 2018-07-16
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多