c ++类中的static int - 编译时错误

时间:2010-05-11 08:43:14

标签: c++

我希望有一个简单的课程,我可以在程序运行时调用以获取一个唯一的编号 - 我可以使用动态分配执行以下操作,然后在不需要时执行delete,但我仍然想要获得static版本。 奇怪的是,下面的代码(看起来很简单)引发了一些奇怪的comiple错误(附后)。

有什么想法吗?这是不正确的静态使用吗?

class Id_gen {
    private:
 //adding static here stops the code from compiling:
 static int curr_id;

    public:

 Id_gen() {curr_id = 1; cout<<"debug:constructed"; }
 int get_id() {curr_id++; return curr_id; };
};

int main () {


    Id_gen bGen;
    cout << bGen.get_id() <<endl;

return 0;    
}

运行g ++(linux 64):

c++2.cpp:(.text._ZN6Id_genC1Ev[Id_gen::Id_gen()]+0xe): undefined reference to `Id_gen::curr_id'
/tmp/cc766N6p.o: In function `Id_gen::get_id()':
c++2.cpp:(.text._ZN6Id_gen6get_idEv[Id_gen::get_id()]+0xa): undefined reference to `Id_gen::curr_id'
c++2.cpp:(.text._ZN6Id_gen6get_idEv[Id_gen::get_id()]+0x13): undefined reference to `Id_gen::curr_id'
c++2.cpp:(.text._ZN6Id_gen6get_idEv[Id_gen::get_id()]+0x19): undefined reference to `Id_gen::curr_id'

5 个答案:

答案 0 :(得分:3)

将静态成员的初始化/定义添加为:

int Id_gen::curr_id = 0;

在课程定义之后。

编辑:正如@sbi的评论所述:初始化是可选的,链接器只需要定义。

答案 1 :(得分:2)

您需要定义类外的static变量:

int Id_gen::curr_id;

答案 2 :(得分:0)

您必须在翻译单元(cpp文件)中定义静态成员:

int Id_Gen::curr_id = 0; // Initial value

答案 3 :(得分:0)

您必须在类实现中定义静态实例变量,即:

int Id_Gen::curr_id = 0;

答案 4 :(得分:0)

正如其他人所提到的,你需要在类之外定义变量:

int Id_Gen::curr_id;

如果此类中没有其他内容,则可以省略构造函数并在定义时初始化此变量,并使get_id()函数也为静态。这将允许您在不创建类的实例的情况下调用Id_Gen::get_id()。在当前状态下,如果您错误地创建了两个Id_Gen,则会重置您的ID。