C++ c+中的ID数据成员+;班

C++ c+中的ID数据成员+;班,c++,data-structures,types,datamember,C++,Data Structures,Types,Datamember,我的老师要求我们创建自动生成的ID数据成员,一旦建立就不能修改。 最合适的类型是什么? 如果答案是 静态常量int ID 当它是常量时,如何自动生成它?创建一个常量ID为int,在构造函数初始化列表中初始化它,如 SomeClass(): id(++staticIncrementingInt){ ///other stuf here } 希望这能有所帮助。由于ID必须是唯一的,因此应确保两个实例永远不会获得相同的ID。此外,类外的任何人都不应干扰UID的生成 首先,在类中定义一个静态

我的老师要求我们创建自动生成的ID数据成员,一旦建立就不能修改。 最合适的类型是什么? 如果答案是 静态常量int ID


当它是常量时,如何自动生成它?

创建一个常量ID为int,在构造函数初始化列表中初始化它,如

 SomeClass(): id(++staticIncrementingInt){
   ///other stuf here
 }

希望这能有所帮助。

由于ID必须是唯一的,因此应确保两个实例永远不会获得相同的ID。此外,类外的任何人都不应干扰UID的生成

首先,在类中定义一个静态字段:

class Data
{
private:
    static int newUID;

(...)
};

// The following shall be put in a .cpp file
int Data::newUID = 0;
然后,在创建每个实例后,它应该采用一个新的ID值并递增newUID计数器:

class Data
{
(...)
    const int uid;  

public:
    Data()
        : uid(newUID++)
    {
    }

    int GetUid()
    {
        return uid;
    }
};
除了类之外,没有人可以访问内部newUID,ID会自动为每个实例生成,并且您(几乎1)可以确定,没有两个实例具有相同的ID号


1除非生成的实例略多于40亿个

以下是一个示例:

class SomeClass {
   static int currID;

public:
   const int ID;

   SomeClass() :
      ID(currID++) {  // Initialization list used to initialize ID

   }
};
您必须将其放在.cpp文件中的某个位置:

int SomeClass::currId = 0;
这是用来做的把戏。我们必须这样做,因为它仅在初始化列表中,您可以在实例中分配给
const
成员


核心概念是,您必须具有“全局设置”,以跟踪将分配给将来创建的实例的ID。本例中为
currID
。对于在类中创建的每个实例,将
currID
的值指定为该实例的ID,然后将其递增(
currID
)。通过这种方式,您可以获得具有唯一ID的实例。

您实际上可以调用构造初始化列表中的函数(在本例中为rand)。
现在取决于您如何播种。

如果您的老师允许boost libs,请尝试。一个例子是。它是兼容的。

提示:您将需要一个非常量static和一个常量members。我对这段高效的代码感到满意,它工作得非常完美。非常感谢你。柯立德不是私人会员吗?最后一个语句将如何工作?我有点糊涂了@AlphaMiner在这方面类似于[在.cpp文件中]定义私有(或任何)成员函数的方式。例如,
intMyClass::APrivateFunc(){…}
。为了完全清楚,您将
intsomeclass::currId=0在任何函数之外,同样与定义成员函数的方式相同。