C++ c++;类中的静态int-编译时错误

C++ c++;类中的静态int-编译时错误,c++,C++,我想有一个简单的类,我可以在程序运行时调用它来获得一个唯一的编号-我可以通过动态分配执行以下操作,然后在不需要时删除,但我仍然想得到一个静态版本。 奇怪的是,下面的代码(看起来很简单)抛出了一些奇怪的错误(附在下面) 你知道怎么回事吗?这是对静电的错误使用吗 class Id_gen { private: //adding static here stops the code from compiling: static int curr_id; public: Id_

我想有一个简单的类,我可以在程序运行时调用它来获得一个唯一的编号-我可以通过动态分配执行以下操作,然后在不需要时删除,但我仍然想得到一个静态版本。 奇怪的是,下面的代码(看起来很简单)抛出了一些奇怪的错误(附在下面)

你知道怎么回事吗?这是对静电的错误使用吗

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;    
}

您需要将类外的
静态
变量定义为:

int Id_gen::curr_id;

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


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

int Id_Gen::curr_id = 0;

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

int Id_gen::curr_id = 0;
在类定义之后


编辑:如@sbi:Initialization的注释中所述,初始化是可选的,链接器只需要定义。

如其他人所述,您需要在类之外定义变量:

int Id_Gen::curr_id;

如果该类中没有其他内容,则可以省略构造函数,并在定义该变量时初始化该变量,并使
get\u id()
函数也是静态的。这将允许您调用
Id\u Gen::get\u Id()
,而无需创建类的实例。在当前状态下,如果您错误地创建了两个
Id\u Gen
,您将重置您的Id。

初始化对链接器不重要。这是链接器需要的定义。这些是链接错误,不是编译错误。这些是链接器错误,不是编译时错误。区别很重要——特别是当你开始在团队中工作并为同事创建库时。
int Id_gen::curr_id = 0;
int Id_Gen::curr_id;