在C 中使用静态变量
Using static variables in C++
我有一个类,该类并非任何其他类都拥有,因此通过静态方法访问,例如 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 。它告诉编译器,某个翻译单元中存在这样的变量。对于最终符号分辨率,链接器需要在某些翻译单元中实际找到变量的声明。
相关文章:
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 模板基类中的静态变量
- 类和静态变量
- 不同作用域中的静态变量和全局变量
- 静态变量声明和定义
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 在类中继承静态变量?
- "local scope"中的 C++ 初始化静态变量
- 使用静态变量的递归调用的不同输出
- 复制文件流C++静态变量
- 跨模板化函数编译的静态变量
- C++编译器是否优化了顺序静态变量读取?
- C++,每个循环初始化一个新的静态变量
- (为什么)我们可以在初始化中将非静态类成员分配给静态变量吗?
- 这些语句是否等效(静态变量、常量变量和泛型)
- 程序如何知道静态变量是否需要初始化?
- 类外的静态变量实例化
- 无法解析静态变量
- 函数局部静态变量:从性能角度来看的优点/缺点
- 访问从 CPP 文件到其他头文件的静态变量