C++:错误:非POD元素类型的变长数组

3

我基本上有

int x;
cout << "Please enter how many classrooms there are: ";
cin >> x;
classrooms bunchaClassrooms[x]; //classrooms is a previously declared class.

由于某些原因,它会给出错误:“变长数组的非POD元素类型'x'”,我不知道为什么,如果我要使用一个班级的向量,如何根据用户的输入轻松填充它(我猜想使用for循环)。


你使用哪个编译器? - πάντα ῥεῖ
仅仅因为C++不允许变长数组。(实际上,它们曾计划在C++14中引入,但最终被移至研究小组。) - gx_
3
我更愿意说“GCC接受了它,但是错误的”。这是因为有一个扩展(或许是为了C99兼容性)。如果你用-std=c++11 -pedantic-errors(或-std=c++98 -pedantic-errors)编译,它会拒绝它:error: ISO C++ forbids variable length array ‘bunchaClassrooms’ [-Wvla]。(顺便说一下,针对你的第一个问题,考虑到原始的错误信息,我认为OP正在使用Clang。) - gx_
@g-makulik 在最近更新 Xcode 以及安装 Mavericks 之前 - Remy LeBeau
@RemyLeBeau 是的,这是GCC C/C++的扩展... - πάντα ῥεῖ
显示剩余2条评论
2个回答

7

您可以使用std::vector:

std::vector<classrooms> bunchaClassrooms;
for (int i = 0; i < x; ++i)
{
  classrooms c;
  <... enter classrooms info ...>
  v.push_back(c);
}

非常量边界的数组不太好。


1
@g-makulik 在调用push_back()之前,不要调用resize()(但可以调用reserve()来避免重新分配内存)。另一种方法是调用resize(),或者直接使用计数构造向量,然后赋值v[i] = c;,这更接近于使用数组的方式。 - gx_
@gx_ 当然可以,只是提到这一点是因为原始问题可能涉及从数组中访问任意元素。 - πάντα ῥεῖ

2

变长数组不是该语言的标准特性。您需要在堆上分配内存或创建向量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接