将值设置为静态const unsigned int

时间:2016-03-11 11:56:07

标签: c++ c++11 constructor static const

我有一个具有静态常量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进行编译。

3 个答案:

答案 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的任何实例。这意味着,在上面的示例中,如果classastatica1则不会分别拥有a2的副本。

a的{​​{1}}成员可被视为"全球"存在于static范围内的变量。

因此,要访问class的{​​{1}}成员,请执行以下操作:

class

答案 2 :(得分:1)

构造函数用于初始化具体对象的字段。当您将某些内容声明为static时,它属于整个类,而不是特定于一个对象。这就是为什么你不能在构造函数中实例化该值。

你可以删除静态,并拥有const unsigned int legs,但我猜你不要这样,因为所有的狗都有4条腿。

你可以在Dog.cpp文件中做的另一个更合理的事情是:

unsigned int Dog::legs = 4;