我尝试使用const成员变量设置数组大小,如下所示
class A {
const int SIZE;
A() : SIZE(10) {}
void aaa() { int a[SIZE]; }
};
我无法构建
a [SIZE]
喜欢这个表达式。
当我使用GCC时,构建成功。但是当我使用VC ++(Windows)时,无法构建。
错误消息是“不能在常量表达式中使用'this'”
如何使用const成员变量设置数组大小?
答案 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::vector
和std::array
提供了数组功能,这可能会使我们的代码更具可读性,可移植性和鲁棒性。
我希望在您的情况下,堆栈上的std::array
比std::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];}
};