在C 中使用静态变量

Using static variables in C++

本文关键字:静态 变量      更新时间:2023-10-16

我有一个类,该类并非任何其他类都拥有,因此通过静态方法访问,例如 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.

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

谢谢!

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

Foo Foo::a;

静态数据成员,被编译器视为全局变量,并将其居住在数据段中(只有名称,它们都在类名称空间中并遵循公共/私人规则班级)。
对于全局变量,类静态数据成员的声明类似于 extern 。它告诉编译器,某个翻译单元中存在这样的变量。对于最终符号分辨率,链接器需要在某些翻译单元中实际找到变量的声明。