我有一个班级结构:
A <- B
其中A是基类,B是派生类。 一些独立代码创建这两个类的对象。 A有一个静态变量(比如'static_a'),它在A和B中使用。
我应该在哪里定义这个static_a?当我在A.h中定义它时,它给我链接器错误说多个定义。 然后我将它移动到A.cc文件,并编译通过。但是,我很困惑B类(在Bh和B.cc中定义,它没有看到A.cc中的定义)是否会得到为变量static_a定义的正确值,因为它是在A.cc中定义的? ?
感谢您的帮助!
答案 0 :(得分:4)
静态变量定义有点像声明extern
变量或函数原型。它允许链接器知道所有编译单元中的变量或函数 somewhere ,但它不创建变量,它只是说它将存在于某处。它不会使变量存在。
当您将定义放在头文件中时,包含该头文件的每个文件都将重新声明该变量,这就是您遇到链接器错误的原因。您正在创建具有相同名称的多个变量,因此链接器不知道要使用哪个变量。
当您在cc
文件中放置实际定义时,您在创建变量一次,并且每当有人在其他地方使用它时这个项目,他们正在使用那个。
所以基本上,你做的一切都是正确的。
答案 1 :(得分:2)
在标头中声明您的变量并在cc文件中定义它(初始化它)。 B类只需要声明你的静态。不用担心,它会起作用。
A.H
class A{
public:
static int x;
};
A.cc
int A::x = 0;
B.h
class B : public A{
void foo()
{
if ( A::x == 0 )
//this is true
}
}