我在下面定义了一个小的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
如何了解错误消息的含义,以及如何解决?
答案 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; }
};