hot*_*ang 37 c++ arrays codeblocks
有没有理由为什么代码块告诉我我不能创建一个数组?我只是想做:
const unsigned int ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};
Run Code Online (Sandbox Code Playgroud)
它给了我
错误:在'{'标记之前,不允许使用括号括起的初始值设定项
我已经更改了初始化程序的其他部分,但错误总是说同样的事情.这似乎没有意义,因为这是我在c ++中学到的第一件事.
Lig*_*ica 57
你说你在一个类中做了这个,作为一个私有变量.
回想一下(目前),成员变量可能不会在您声明它们的相同位置初始化(除了少数例外).
struct T {
std::string str = "lol";
};
Run Code Online (Sandbox Code Playgroud)
不行.它一定要是:
struct T {
std::string str;
T() : str("lol") {}
};
Run Code Online (Sandbox Code Playgroud)
但是,为了增加对伤害的侮辱,在C++之前的0x你不能初始化ctor-initializer!中的数组:
struct T {
const unsigned int array[10];
T() : array({0,1,2,3,4,5,6,7,8,9}) {} // not possible :(
};
Run Code Online (Sandbox Code Playgroud)
而且,因为你的数组的元素是const,你不能依赖于赋值:
struct T {
const unsigned int array[10];
T() {
for (int i = 0; i < 10; i++)
array[i] = i; // not possible :(
}
};
Run Code Online (Sandbox Code Playgroud)
但是,正如其他一些贡献者已经非常正确地指出的那样,T如果你不能修改它的元素,那么为每个实例提供一个数组副本似乎没什么意义.相反,您可以使用static成员.
因此,以下将最终解决您的问题 - 可能 - 最好的方法:
struct T {
static const unsigned int array[10];
};
const unsigned int T::array[10] = {0,1,2,3,4,5,6,7,8,9};
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
由于这是类中的私有成员变量(根据注释),因此在C++ 03中确实不允许这样做.
许多现代编译器部分支持的C++ 0x允许以下编译:
class C
{
const unsigned int ARRAY[10];
public:
C() : ARRAY{0,1,2,3,4,5,6,7,8,9} {}
};
int main()
{
C obj; // contains a non-static const member: non-assignable
}
Run Code Online (Sandbox Code Playgroud)
但是,非静态const成员只有在类的不同实例中包含不同的值时才有意义.如果每个实例都包含相同的内容{0,1,2,3,4,5,6,7,8,9},那么你应该创建它static,这也可以在C++ 98中实现:
class C
{
static const unsigned int ARRAY[10];
public:
C() {}
};
const unsigned int C::ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};
int main()
{
C obj;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
60361 次 |
| 最近记录: |