定义基类的静态变量

时间:2011-08-16 19:06:23

标签: c++ inheritance static

我有一个班级结构:

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中定义的? ?

感谢您的帮助!

2 个答案:

答案 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
    }
}