警告:非静态数据成员初始值设定项仅适用于-std = c ++ 11或-std = gnu ++ 11?

时间:2015-10-21 05:02:49

标签: c++ class object c++11

我有这段代码

class Move
{
    public:
        Move()
        {
            name = "";
            type_num = 18;
            power = 0;
            accuracy = 0;
            type = "???";
        }

        Move(string a, int b, int c, int d)
        {
            name = a;
            type_num = b;
            power = c;
            accuracy = d;
            /*lines of code to give type a string variable depending on the value of type_num*/
        }

    private:
        string name, type;
        int type_num, power, accuracy;
};

class Moveset
{
    public:
        Moveset()
        {
        }               
    private:
        Move slot1{"MOVE 1", rand() % 18, 10*(rand() % 15 + 1), 5 * (rand() % 11 + 10)};
};

编译器给了我这个警告,用于在Moveset类的私有部分下声明对象slot1。

464 83  C:\Users\N\Desktop\C++\Poke\Poke.cpp    [Warning] non-static data member initializers only available with -std=c++11 or -std=gnu++11
464 15  C:\Users\N\Desktop\C++\Poke\Poke.cpp    [Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11
464 83  C:\Users\N\Desktop\C++\Poke\Poke.cpp    [Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11

虽然它给了我警告但显然它没有影响程序运行。它真的影响了什么吗?我在这里做错了什么?

编辑:静态成员初始化器和非静态成员初始化器之间的差异是什么?

2 个答案:

答案 0 :(得分:1)

编译器可能允许它作为扩展,在旧的C ++标准中实际上是不允许的。

通过构造函数初始化列表初始化对象,或使用编译器告诉您的标志启用C ++ 11。

使用构造函数初始化列表的示例:

class Moveset
{
public:
    Moveset()
        : slot1{"MOVE 1", rand() % 18, 10*(rand() % 15 + 1), 5 * (rand() % 11 + 10)}
    {
    }
private:
    Move slot1;
};

你似乎正在使用某种IDE,所以我不知道如何添加标志,但通常在项目设置的某个地方有一个标签,用于编译器及其设置,你在哪里应该能够添加标志(如果没有C ++ 11的复选框),只需在那里添加-std=c++11

答案 1 :(得分:0)

你问:

  

编辑:静态成员初始化程序和非静态成员初始化程序之间有什么区别?

没有太大的不同 初始化static成员的初始化程序是静态成员初始化程序 初始化非static成员的初始化程序是非静态成员初始值设定项。

class foo
{    
    static int var2 = 20;  // static member initializer
    int var1 = 10;         // non-static member initializer
};