【问题标题】:How to initialize an array in C++ objects如何在 C++ 对象中初始化数组
【发布时间】:2012-05-28 12:15:22
【问题描述】:

看完How to initialize an array in C,特别是:

不过,不要忽视显而易见的解决方案:

int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };

我尝试过这样的事情:

#include <iostream>

class Something {
private:

int myArray[10];

public:

Something() {
    myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
}

int ShowThingy(int what) {
    return myArray[what];
}

~Something() {}
};

int main () {
   Something Thing;
    std::cerr << Thing.ShowThingy(3);
}

我得到:

..\src\Something.cpp: In constructor 'Something::Something()':
..\src\Something.cpp:10:48: error: cannot convert '<brace-enclosed initializer list>' to 'int' in assignment

在这种情况下明显的并不那么明显。我真的希望我的数组的启动也更加动态。

我累了:

private:
    int * myArray;

public:
    Something() {
            myArray = new int [10];
            myArray = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
}

这对我来说看起来很时髦,对编译器来说也是如此:

..\src\Something.cpp: In constructor 'Something::Something()':
..\src\Something.cpp:11:44: error: cannot convert '<brace-enclosed initializer list>' to 'int*' in assignment

这也不起作用:

private:
int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };

与:

 ..\src\Something.cpp:6:20: error: a brace-enclosed initializer is not allowed here before '{' token
 ..\src\Something.cpp:6:51: sorry, unimplemented: non-static data member initializers
 ..\src\Something.cpp:6:51: error: 'constexpr' needed for in-class initialization of static data member 'myArray' of non-integral type

我一直做得很好,并且学习了哪些不起作用的东西,但不太好学习哪些有用的东西。

那么,我如何使用初始化列表 {value, value, value} 用于类中的数组?

一段时间以来,我一直在试图弄清楚如何做到这一点,但我非常困惑,我需要为我的应用制作许多此类列表。

【问题讨论】:

  • C++ 中原始数组的一个愚蠢之处在于它们不能直接赋值。 (即,以下是不允许的。int a[10], b[10]; a = b;
  • 由于本文中提到了 C++11,我将指出 std::array:std::array&lt;int, 10&gt; a = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; std::array&lt;int, 10&gt; b = a; std::array&lt;int, 10&gt; c; c.fill(5);

标签: c++ arrays class initialization


【解决方案1】:

需要在构造函数初始化列表中初始化数组

#include <iostream>

class Something {
private:

int myArray[10];

public:

Something()
: myArray { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }
{
}

int ShowThingy(int what) {
    return myArray[what];
}

~Something() {}
};

int main () {
   Something Thing;
    std::cerr << Thing.ShowThingy(3);
}

..\src\Something.cpp:6:51:抱歉,未实现:非静态数据成员初始化器

C++11 还增加了对非静态成员变量内联初始化的支持,但是正如上面的错误信息所述,你的编译器还没有实现这一点。

【讨论】:

  • 你能做到吗?很酷,这是在哪个标准中添加的?
  • @derekerdmann Initializer lists 在 C++11 中添加
  • @derekerdmann gcc 4.5.1 supports 它。我知道 VC++ 不会,即使在即将发布的 VC11 版本中,也不确定编译器。
  • @shengy - 我相信。至少,您可以创建一个静态常量,以便在创建新实例时复制。
  • @Prætorian, IIRC 来自对我的其他答案之一的评论,同时使用括号和初始化列表是不正确的,尽管在 GCC 上编译得很好。
【解决方案2】:

除非我弄错了,否则只有在声明期间初始化变量时才允许使用初始化列表——因此得名。您无法将初始化列表分配给变量,就像您在大多数示例中所做的那样。

在上一个示例中,您尝试将静态初始化添加到非静态成员。如果你想让数组成为类的静态成员,你可以尝试这样的事情:

class Derp {
private:
    static int myArray[10];
}

Derp::myArray[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };

如果要添加类成员,可以尝试制作静态数组const,并将其复制到构造函数中的成员数组中。

【讨论】:

  • 从技术上讲,您可以将初始化列表分配给 C++11 中 std::initializer_list&lt;T&gt; 类型的变量。
猜你喜欢
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 2020-04-21
  • 2016-03-11
  • 1970-01-01
相关资源
最近更新 更多