【问题标题】:c++ Inheritance (no base constructor) without initializer lists (lower than c++ 11)?没有初始化列表(低于 c++ 11)的 c++ 继承(无基本构造函数)?
【发布时间】:2021-08-27 18:01:39
【问题描述】:

我正在用 c++ 实现装饰器设计模式,我遇到了这个问题(代码取自 https://www.studytonight.com/cpp/initializer-list-in-cpp.php):

#include<iostream>
using namespace std;

class Base_
{
    public:
    // parameterized constructor
    Base_(int x)
    {
        cout << "Base Class Constructor. Value is: " << x << endl;
    }
};

class InitilizerList_:public Base_
{
    public:
    // default constructor
    InitilizerList_()
    {
        Base_ b(10);
        cout << "InitilizerList_'s Constructor" << endl;
    }
};

int main()
{
    InitilizerList_ il;
    return 0;
}

正如网站所述,这不会编译,因为在派生构造函数之前调用了基构造函数,并且使用初始化列表解决了这个问题。我的问题是:这可以在没有初始化列表的情况下实现吗?如果可以,如何实现?初始化器列表是在 c++ 11 中引入的(我认为)那么如果您尝试在 c++ 98 中执行此操作呢?

【问题讨论】:

  • 您将“初始化列表”与“基类初始化”和“成员初始化”混为一谈。该链接中的代码在 C++98 中可以正常工作。
  • (顺便说一句,那个网页很糟糕。请参阅stackoverflow.com/questions/388242/… 以获得更好的选择。)

标签: c++ c++11 inheritance decorator c++98


【解决方案1】:

派生类构造函数委托给基类构造函数的语法如下

class InitilizerList_ : public Base_
{
public:
    // default constructor
    InitilizerList_() : Base_(10)
    {
        cout << "InitilizerList_'s Constructor" << endl;
    }
};

【讨论】:

    【解决方案2】:

    您对术语感到困惑。有一个初始化列表,看起来像{ for, bar, baz, ... },有一个std::initializer_list类型可以包装一个初始化列表,然后是类成员初始化列表,用于初始化类中的成员。

    最后一个是您想要的,并且自创建以来一直是 C++ 的一部分。使用一个会给你

    InitilizerList_() : Base_(10)
    {
        cout << "InitilizerList_'s Constructor" << endl;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 2013-12-24
      • 2015-03-02
      • 2016-07-19
      • 2013-05-21
      • 2021-04-29
      • 2017-08-30
      相关资源
      最近更新 更多