C ++变量数组作为类成员

时间:2012-05-05 07:09:28

标签: c++ arrays

我在下面定义了一个小的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

如何了解错误消息的含义,以及如何解决?

3 个答案:

答案 0 :(得分:11)

在编译时不能使用具有未定义大小的数组。有两种方法:将a定义为static 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;
};

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

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

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; }
};