我在A.h中有以下代码:
class A
{
public:
...
private:
...
const int X = 1;
float Y[X];
...
};
如果项目中只包含标题A.h,则编译很好。但是如果我把A.h包括在内,那就说A.cpp它给我带来了如下奇怪的错误:
...警告:非静态数据成员初始值设定项仅适用于 -std = c ++ 11或-std = gnu ++ 11 [默认启用]
...错误:无效使用非静态数据成员'A :: X'
...错误:从这个位置
即使我改变const int X = 1;
(虽然我需要它作为常量参数),但没有任何改变。
P.S。如果有意义我使用Qt 5.1
p.s.s。实际上使它static
修复错误。但为什么我必须这样做?
答案 0 :(得分:5)
第一个问题是你正在编译旧版本的C ++,它不允许在声明中初始化非静态(即每个对象而不是每个类)成员。您可以针对C ++ 11进行编译(如错误消息所示);或者在构造函数中初始化它;如果您不需要为您创建的每个对象分别设置一个值,请将其设为static
。
第二个问题是数组大小必须是编译时常量。非静态成员const
或其他成员不符合该法案。原则上,它可以在不同的对象中具有不同的值(即使它在声明中初始化,它可以被一个或多个构造函数覆盖),因此没有编译时值。静态成员 具有固定值,因此如果值可用,可以用作数组大小。
答案 1 :(得分:2)
您希望在X
的构造函数初始化列表中初始化A
,因为它是non-static const
的{{1}}成员:
A
也就是说,从类class A {
const int X;
public:
A() : X(1) {
// ...
}
// ...
实例化的每个对象都有一个名为A
的{{1}}成员(即int
部分,即它不是该类的成员)那是X
(它不能修改或重置,所以你必须在构造函数初始化列表中初始化它,而不是构造函数体。)
答案 2 :(得分:2)
你的意图是在课堂上有一个constant
变量。
现在这个类用于创建许多对象。实际上,类应该允许每个对象具有const
数据成员的不同const
值,因此您无法初始化类中的const
成员。
const
表示值在对象的整个生命周期内都是恒定的。
这就是为什么存在一个名为constructor initialization list
的特殊初始化点,而不是允许在构造函数中进行初始化。
现在,如果您允许在构造函数中初始化const
成员,那么您可以在构造函数本身中多次重新分配它,这会消除const
的含义(这意味着已分配)一次,并在整个过程中保持不变。
因此const
成员的初始化应该在构造函数之前进行,这在初始化列表中完成。如果需要,这会为const
个成员提供不同对象的不同值。
另请注意,构造函数i(ii)
中的初始化形式用于在进入构造函数之前初始化数据成员
class A
{
const int i;
public:
A(int ii): i(ii)
{
// i = 5; Can't do this since i is `const`
}
};
话虽如此,如果您希望所有对象共享相同的const
值,那么您可以使用其他答案中指向的static const
限定符。
同样正如Mike Seymour指出的那样,为了分配数组或初始化const
变量,你需要有一个comiple-time常量,但是类中的consts
不会给你编译时常量,因此你必须使用static const
限定符,使其成为编译时常量。
答案 3 :(得分:0)
这很简单
答案 4 :(得分:0)
这是你的罪魁祸首
float Y[X];
由于您尝试使用大小为X的Y名称声明一个float数组。但它是该类的非静态私有成员。
因此,X将在符号表中,但在编译上述行期间无法访问相关值,因此警告和错误。