4

我有一个小的 C++ 程序定义如下:

class Test
{
   public:
   int a;
   int b[a];
};

编译时,会产生错误:

testClass.C:7:5: error: invalid use of non-static data member ‘Test::a’
testClass.C:8:7: error: from this location
testClass.C:8:8: error: array bound is not an integer constant before ‘]’ token

我如何了解错误消息的含义,以及如何修复它?

4

3 回答 3

11

您不能在编译时使用未定义大小的数组。有两种方法:定义astatic const int a = 100;并忘记动态大小或使用std::vector,这比手动内存管理更安全:

class Test
{
public:
  Test(int Num)
    : a(Num)
    , b(Num) // Here Num items are allocated
  {
  }
  int a;
  std::vector<int> b;
};
于 2012-05-05T08:11:42.973 回答
6

除非您动态分配它们(例如 with new[]),否则 C++ 中的数组必须有一个编译时常量作为大小。并且Test::a不是编译时常量;它是一个成员变量。

于 2012-05-05T07:11:33.930 回答
6

让我们来看看这背后的完整原因,首先当你最初声明一个类时,任何成员变量都没有分配任何内存,因此公共或私有方法没有价值。这是给您的快速提示,现在针对您的问题:

您不能在类之外执行此操作,因为在编译之前应该知道任何数组大小,因为任何静态声明的数组都驻留在函数的堆栈帧中,并且编译器需要知道要准确分配多少内存。内存中唯一由程序员调整大小的段是。因此,每当您想要动态分配数组大小时,都需要将其声明为驻留在堆中,您可以这样做:

int a;
cin >> a;
int * b = new int[a];

这是声明具有未知大小(在运行时确定的大小)的数组的正确方法,将其与您的类集成这是您的操作方式,并记住任何类的私有或公共属性都没有内存 - 它们只是声明不应该在成员方法的其他地方或类之外包含任何初始化 - 这是因为它们是公共的,就像你的情况一样 - 当然在声明类的实例之后,例如 Test t. 无论如何,这是你在课堂上的做法:

class Test
{
public:
int a;
int * b;
Test(int Ia=1) {
    a = Ia;
    b = new int[a];
}
~Test() {
    delete[] b;
}
};

请参阅C++ 中的 delete vs delete[] 运算符,了解为什么要在析构函数中使用delete[]而不是delete在析构函数中使用。

于 2012-05-05T07:26:15.053 回答