在 C++ 中使用静态变量 [重复]

Posted

技术标签:

【中文标题】在 C++ 中使用静态变量 [重复]【英文标题】:Using static variables in C++ [duplicate] 【发布时间】:2014-01-21 15:08:57 【问题描述】:

我有一个不属于任何其他类的类,因此可以通过 addKeyword() 等静态方法访问:

class Foo 

  public:

   /* other public methods and such */

    static void addKeyword(Keyword& keyword);

  private:

    static Foo a;

    std::vector<Keyword> keywords;

    /* Foo's private variables and methods */

    void addKeywordToObject(Keyword& keyword);


这样做的想法是我可以调用:

//called from elsewhere in the program
void Foo::addKeyword(Keyword& keyword)
  a.addKeywordToObject(keyword);


//called from addKeyword() above
void Foo::addKeywordToObject(Keyword& keyword)
  this->keywords.push_back(keyword);

并且关键字被添加到a的关键字向量中。

但是 - 我确信我做错了什么 - 当我尝试编译这段代码时,我得到了链接器错误:

Undefined symbols for architecture x86_64: "Namespace::Foo::a", referenced from:
Namespace::Foo::addKeyword(Namespace::Keyword) in Foo.o.

我有一种感觉,这是因为我错误地使用了静态变量,但我不确定如何或为什么。谁能指出我正确的方向?

谢谢!

【问题讨论】:

【参考方案1】:

您需要在实现文件中定义static 成员。

Foo Foo::a;

【讨论】:

成功了!你能告诉我为什么会这样吗?【参考方案2】:

静态数据成员,编译器将其视为全局变量,并按原样驻留在数据段中(仅从名称上讲,它们位于类命名空间中并遵循类的公共/私有规则)。 类中静态数据成员的声明类似于全局变量的extern。它告诉编译器这样的变量存在于某个翻译单元中。对于最终的符号解析,链接器需要在某个翻译单元中实际找到变量的声明。

【讨论】:

以上是关于在 C++ 中使用静态变量 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

c++中静态成员变量和静态成员函数(笔试经历)

如何在构造函数 C++ 中使用静态变量?

编译失败,将静态变量作为私有成员变量的c ++程序[重复]

子类是不是共享 C++ 中父类的静态变量? [复制]

C++ 类中的静态成员变量,静态成员函数

C++ 中的静态变量