我有一个具有静态常量unsigned int变量的类。我想根据程序启动时传递的参数初始化此变量。我已经创建了一个示例,说明我想要尝试并找出如何实现它。
的main.cpp
int main() {
const unsigned int legs = 4;
Dog dog(legs);
return 0;
}
Dog.h
class Dog {
public:
Dog(const unsigned int legs);
~Dog();
private:
static const unsigned int legs;
};
Dog.cpp
Dog::Dog(const unsigned int l) : legs(l) {
}
Dog::~Dog() {
}
在main中,我创建了一个变量来模拟运行时从程序传递的值。
编译器出现以下错误:
/home/jota/ClionProjects/Caca/Dog.cpp: In constructor ‘Dog::Dog(unsigned int)’:
/home/jota/ClionProjects/Caca/Dog.cpp:7:34: error: ‘const unsigned int Dog::legs’ is a static data member; it can only be initialized at its definition
Dog::Dog(const unsigned int l) : legs(l) {
^
make[2]: *** [CMakeFiles/Caca.dir/Dog.cpp.o] Error 1
make[1]: *** [CMakeFiles/Caca.dir/all] Error 2
make: *** [all] Error 2
我一直在互联网上看到一些静态const int的例子,就像我使用它一样,或者我可能会遗漏一些东西。我正在使用-std=c++11
进行编译。
答案 0 :(得分:2)
static
字段是类的成员,而不是实例的成员。在构造函数初始化列表中,您只能初始化对象的成员(当然还有超级对象),因此该错误。
将定义更改为:
const unsigned int legs;
答案 1 :(得分:1)
与非静态成员不同,
class A {
public:
int a;
};
int main(void) {
A a1, a2;
a1.a = 10;
a2.a = 20;
return 0;
}
static
的{{1}}成员不属于class
的任何实例。这意味着,在上面的示例中,如果class
为a
,static
和a1
则不会分别拥有a2
的副本。
a
的{{1}}成员可被视为"全球"存在于static
范围内的变量。
因此,要访问class
的{{1}}成员,请执行以下操作:
class
答案 2 :(得分:1)
构造函数用于初始化具体对象的字段。当您将某些内容声明为static
时,它属于整个类,而不是特定于一个对象。这就是为什么你不能在构造函数中实例化该值。
你可以删除静态,并拥有const unsigned int legs
,但我猜你不要这样,因为所有的狗都有4条腿。
你可以在Dog.cpp文件中做的另一个更合理的事情是:
unsigned int Dog::legs = 4;