c++类中的ID数据成员

ID data member in c++ class

本文关键字:ID 数据成员 c++      更新时间:2023-10-16

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

当它是const时,我如何自动生成它?

由于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的实例。

创建const ID为int,在构造函数初始化列表中初始化,如

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

实际上可以在构造初始化列表中调用函数(在本例中为rand)。现在就看你怎么播种了

如果您的老师允许boost库,那么尝试boost . uuid。这里有一个例子。