【问题标题】:Setting value to an static const unsigned int将值设置为静态 const unsigned int
【发布时间】:2016-06-26 15:58:40
【问题描述】:

我有一个具有静态常量 unsigned int 变量的类。我想根据程序启动时传递的参数来初始化这个变量。我已经创建了一个示例,说明我想尝试弄清楚如何实现这一点。

main.cpp

int main() {
    const unsigned int legs = 4;
    Dog dog(legs);
    return 0;
}

狗.h

class Dog {
public:
    Dog(const unsigned int legs);
    ~Dog();
private:
    static const unsigned int legs;
};

狗.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 进行编译。

【问题讨论】:

  • 将变量标记为静态类成员意味着它独立于该类的具体对象。当您创建该类的多个对象时,您认为这应该如何工作?
  • 在输入main 之前初始化变量,这将是困难的。您一定误解了您找到的示例。

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


【解决方案1】:

static 字段是类的成员,而不是实例的成员。在构造函数初始化器列表中,您只能初始化对象的成员(当然还有超级对象),因此会出现错误。

将定义改为:

const unsigned int legs;

【讨论】:

    【解决方案2】:

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

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

    您可以在 Dog.cpp 文件中做的另一件更合乎逻辑的事情是:

    unsigned int Dog::legs = 4;
    

    【讨论】:

    • 您的意思是Dog::legs = 4; 吗?顺便说一句,并不是每只狗都有 4 条腿。
    • 我的意思是,谢谢@tobi303。好吧,我可以想象一只残疾狗,但我很确定所有的狗都有 4 条腿。如果他们有不同数量的腿,那么制作legs static 是没有意义的。
    【解决方案3】:

    不像这样的非静态成员,

    class A {
    public:
      int a;
    };
    
    int main(void) {
      A a1, a2;
      a1.a = 10;
      a2.a = 20;
    
      return 0;
    }
    

    classstatic 成员不属于class 的任何实例。这意味着在上面的示例中,如果 astatica1a2 将不会都有 a 的副本。

    classstatic 成员可以被认为是存在于class 范围内的“全局”变量。

    因此,要访问 classstatic 成员,您可以这样做:

    class A {
    public:
      static int a;
    };
    
    int A::a = 0; //A static member variable needs to be defined in a translation unit(or .c/.cpp file)
    
    int main(void) {
      A::a = 50;
    
      return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-16
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 2020-09-05
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      相关资源
      最近更新 更多