如何使用const成员变量设置数组大小?

时间:2019-01-18 02:31:50

标签: c++ arrays visual-c++ constant-expression

我尝试使用const成员变量设置数组大小,如下所示

class A {
  const int SIZE;

  A() : SIZE(10) {}
  void aaa() { int a[SIZE]; }
};

我无法构建

  

a [SIZE]

喜欢这个表达式。

当我使用GCC时,构建成功。但是当我使用VC ++(Windows)时,无法构建。

错误消息是“不能在常量表达式中使用'this'”

如何使用const成员变量设置数组大小?

3 个答案:

答案 0 :(得分:1)

可变长度数组

  

当我使用VC ++(Windows)时,无法构建。

在堆栈上创建具有自动存储持续时间的数组int a[SIZE]。 然后通常必须在C ++中的编译时确定此SIZE。 但是您的SIZE的定义没有如下值:

const int SIZE;

因此,编译器在编译时不知道其值,并且会显示编译错误。 因此,您的SIZE是一个动态变量。

  

使用GCC时,构建成功。

...但是某些C ++编译器支持VLA(可变长度数组),这是C99的新增功能,并允许在堆栈上以动态长度声明C样式的数组。 VC ++不支持C99和VLA,但支持GNU compiler supports VLA as an extension even in C90 and C++这就是为什么您可以通过GCC编译以上代码而不会出错的原因。

如果您在gcc编译命令中添加了-pedantic-pedantic-errors)选项,我们将获得大多数gcc扩展名的警告(错误)。 在这种情况下,使用此选项,我们应该收到警告(错误)消息:ISO C++ forbids variable length array 'a'


如何解决当前错误?

(1)如果要使用C样式的数组,一种方法是使SIZE成为如下宏。然后,编译器可以在编译时知道它的价值:

#define SIZE 10

class A
{
public:
  A() {}
  void aaa() { int a[SIZE]; }
};

(2)在类定义中将SIZE的值定义为static const变量,然后编译器可以再次在编译时知道它的值:

class A
{
  static constexpr int SIZE = 10;

public:
  A() {}
  void aaa() { int a[SIZE]; }
};

(3)C ++通过std::vectorstd::array提供了数组功能,这可能会使我们的代码更具可读性,可移植性和鲁棒性。 我希望在您的情况下,堆栈上的std::arraystd::vector更有效率,因为10个int需要更少的内存,并且std::array仅在堆栈上分配一次而不会引起问题。 这是std::array的解决方案:

#include <array>

class A
{
  static constexpr int SIZE = 10;

public:
  A() {}
  void aaa() { std::array<int, SIZE> a; }
};

答案 1 :(得分:0)

好吧,SIZE可能不是宏,因为在这里,您将其初始化为10并将其作为变量。如果它是一个宏,则表达式int a[SIZE]可以使用,但无论如何都不需要2-4行。

如果SIZE是一个普通变量(如此处,它是使用大小参数动态创建的A,尽管 输入可能来自宏),则您应该使用向量。

#include <vector>

class A {
  const int SIZE;

  A() : SIZE(10) {}
  void aaa() { std::vector<int> a(SIZE); }
};

a的用法现在相同。

答案 2 :(得分:0)

如果您使用的是 c++11 之前的旧编译器,例如 c++03,您也可以执行 enum {SIZE=10};

class A {
  enum {SIZE=10};

  void aaa() {int a[SIZE];}
};