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;