为什么可以';在C++;还是制作可变大小的数组? 我几乎没有什么关于C++的知识,也不知道如何使用数组。也就是说,我要做的是为化学元素创建一个简单的类,它会自动根据元素的原子序数决定分配给该元素的壳数。以下是我的示例代码: class Element { int n, i; int s = 1; for (int i = 2; i < n; i += 8) {s += 1;} int shell[s + 1]; public: Element(int n) {this.n = n;} }; 类元素{ int n,i; int s=1; 对于(inti=2;i

为什么可以';在C++;还是制作可变大小的数组? 我几乎没有什么关于C++的知识,也不知道如何使用数组。也就是说,我要做的是为化学元素创建一个简单的类,它会自动根据元素的原子序数决定分配给该元素的壳数。以下是我的示例代码: class Element { int n, i; int s = 1; for (int i = 2; i < n; i += 8) {s += 1;} int shell[s + 1]; public: Element(int n) {this.n = n;} }; 类元素{ int n,i; int s=1; 对于(inti=2;i,c++,arrays,oop,for-loop,C++,Arrays,Oop,For Loop,这段代码应该创建一个名为intshell[s+1]的数组,其中包含s-1 shell。我将它改为s-1而不是s,这样我就不会经常将shell#1称为shell[0]等等,从而混淆自己。因此,shell[0]未使用。或者我也可以用另一种方法,实际使用shell[0],但这并不重要。如您所见,ints会自动设置为1,因为所有元素都至少包含一个shell。然后有一个for循环,它根据intn添加shell。最后,我声明了数组intshell[s+1] 最终,我犯了很多错误。它们中的大多数都是无意义的语

这段代码应该创建一个名为
intshell[s+1]
的数组,其中包含s-1 shell。我将它改为s-1而不是s,这样我就不会经常将shell#1称为shell[0]等等,从而混淆自己。因此,shell[0]未使用。或者我也可以用另一种方法,实际使用shell[0],但这并不重要。如您所见,
ints
会自动设置为1,因为所有元素都至少包含一个shell。然后有一个for循环,它根据
intn
添加shell。最后,我声明了数组
intshell[s+1]


最终,我犯了很多错误。它们中的大多数都是无意义的语法错误,但是显然C++中不允许初始化非最终实例变量。这对我来说没有多大意义,因为对于for循环,我确实需要
ints
从1开始。它还告诉我,我也不能制作可变大小的数组。怎么办?

您可以使用
std::vector
并在构造函数中初始化它:

class Element {
   int s, n;
   std::vector<int> shell;

   public: Element(int n) : s(1), n(n) {
       for (int i = 2; i < n; i += 8) {s += 1;}  
       shell.resize(s + 1);
   }
};
类元素{
int s,n;
向量壳;
公共:元素(整数n):s(1),n(n){
对于(inti=2;i
不能将for循环置于函数体之外。除此之外,C++不支持可变长度数组。大小必须是编译时常量。但是您可以使用
std::vector
并用运行时确定的大小实例化它。我建议你先学习一些C++基础。你的代码有太多的问题。@SteveJessop:我认为当使用初始化列表时,成员会按照它们在初始化列表中出现的顺序进行初始化,而不管它们在类中的声明顺序如何;无论初始化器列表中的顺序如何,它们都是按照类中声明的顺序初始化的。否则,将无法为析构函数生成一个代码(因为对象需要按与初始化相反的顺序销毁)。@Angew:aah,好的:)我不知道为什么我会以相反的方式记住它,但这很有道理:)你忘了告诉我我需要向量头文件,但除此之外,这很有效,谢谢。