在C ++中使用静态变量

时间:2014-01-21 15:08:58

标签: c++ variables static undefined-symbol

我有一个类,它不属于任何其他类,因此可以通过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);
}

关键字会添加到关键字矢量中。

但是 - 我确信我正在做的事情从根本上做错了 - 当我尝试编译这段代码时,我得到了链接器错误:

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

我有一种感觉,因为我错误地使用了静态变量,但我不确定如何或为什么。任何人都可以指出我正确的方向吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

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

Foo Foo::a;

答案 1 :(得分:1)

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