我希望有一个简单的课程,我可以在程序运行时调用以获取一个唯一的编号 - 我可以使用动态分配执行以下操作,然后在不需要时执行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'
答案 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。