【问题标题】:initialize class array in initialization list c++在初始化列表c ++中初始化类数组
【发布时间】:2023-03-13 02:40:01
【问题描述】:

我有这门课:

class Taxi {
   Wheel myWheel[4];
public:
   Taxi();
};

和 Wheel 是另一个类包含:

class Wheel{
   int radius,
       tickness;
public:
   Wheel(int,int);
};

现在,我要做的是在 Taxi 构造函数的初始化列表中初始化“myWheel[4]”,如下所示:

Taxi::Taxi () :Wheel[0](5,5), Wheel[1](3,3), Wheel[2](5,5), Wheel[3](3,3) {
   cout << "Ctor of Taxi" << endl;
}

但它不起作用,我真的需要一些帮助, 谢谢:)

【问题讨论】:

    标签: c++ arrays list class initialization


    【解决方案1】:

    你的初始化列表应该是这样的

    Taxi::Taxi () : myWheel { Wheel(5,5), Wheel(3,3), Wheel(5,5), Wheel(3,3)} {
       cout << "Ctor of Taxi" << endl;
    }
    

    查看LIVE DEMO

    如果您没有符合当前 c++ 标准 (c++11) 的编译器,则无法在成员初始化程序列表中执行此操作。您必须在构造函数的主体内初始化数组元素:

    Taxi::Taxi () {
       cout << "Ctor of Taxi" << endl;
       myWheel[0] = Wheel(5,5);
       myWheel[1] = Wheel(3,3);
       myWheel[2] = Wheel(5,5); 
       myWheel[3] = Wheel(3,3);
    }
    

    还请注意,您应该将 Wheel 设为 nice class

    【讨论】:

    • 它不起作用 :/ 错误:- 仅允许 '()' 作为数组成员“AutoTaxi::_taxiWheel”的初始化程序 - 预期声明 - 预期为 ';' -'AutoTaxi::AutoTaxi::_taxiWheel' : 无法为数组指定显式初始化器
    • @Naama 好吧,链接的演示有效。您确定正确复制了代码吗?在它起作用之前,我必须修复一些其他错误。还要注意WheelTaxi 的声明顺序。您的编译器版本语言标准标志实际上是什么?
    • @Naama,这需要 C++11
    • #πάντα ῥεῖ 抱歉,我不知道如何检查编译器版本。我知道我正在使用 Visual Studio Pro 2013 版本 12.0.21
    • 请查看此问答:Workaround for error C2536: cannot specify explicit initializer for arrays in Visual Studio 2013。看起来VS2013(默认支持 c++11)在这个问题上被打破了。
    【解决方案2】:

    如果你有一个支持 C++11 的编译器,你只能初始化数组,然后你就可以这样做

    Taxi::Taxi () :myWheel{{5,5}, {3,3}, {5,5}, {3,3}} { ... }
    

    如果您没有支持 C++11 的编译器,则必须手动初始化数组:

    Taxi::Taxi()
    {
        myWheel[0] = Wheel(5, 5);
        myWheel[1] = Wheel(3, 3);
        myWheel[2] = Wheel(5, 5);
        myWheel[3] = Wheel(3, 3);
    }
    

    【讨论】:

    • 也不能正常工作.. 错误:无法为数组指定显式初始化器
    • 我不认为第二个变种是合法的 C++。
    • 每个人都正确,它在 C++11 之前的版本中无效。更新了我的答案