可能无法初始化可变大小的对象

时间:2012-03-13 16:39:06

标签: c++ arrays

我有一个这样的课程

class aClass
{
  public:
    aClass() : N(5) {}
    void aMemberFunction()
    {
      int nums[N] = {1,2,3,4,5};
    }
  private:
    const int N;
};

测试代码是

int main()
{
  aClass A;
  A.aMemberFunction();

  const int N = 5;
  int ints[N] = {5,4,3,2,1};
  return 0;
}

编译时(g ++ 4.6.2 20111027),我收到错误

problem.h: In member function ‘void aClass::aMemberFunction()’:
problem.h:7:31: error: variable-sized object ‘nums’ may not be initialized

如果我用int nums[N]注释掉这一行我没有收到编译错误,那么ints数组的类似代码就可以了。编译时是否知道N的值?

发生了什么?为什么nums被认为是一个可变大小的数组?为什么数组numsints的处理方式不同?

2 个答案:

答案 0 :(得分:9)

  

编译时是否知道N的值?

没有。在编译aMemberFunction时,编译器现在不是N,因为它的值是在运行时确定的。看到只有一个构造函数并且假设N的值可能不等于5,这是不够智能的。

答案 1 :(得分:3)

在您的示例中,

N在编译时是未知的,但它位于以下位置:

class aClass
{
  private:
    static const int N = 5;
  public:
    aClass() {}
    void aMemberFunction()
    {
      int nums[N] = {1,2,3,4,5};
    }
};

上面的代码将编译,并将声明一个包含五个int的本地数组。