C++类中的ID数据成员

5

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

那么在它是常量的情况下,如何自动生成它呢?


1
你需要一个非常量静态成员和一个常量成员。 - qPCR4vir
5个回答

10

由于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 会自动生成,你几乎可以确定没有两个实例会有相同的 ID 号码。


1 除非你生成超过40亿个实例。


我对这个高效的代码感到满意,而且它运行得非常完美。非常感谢你。 - Nora

2
这是一个例子:
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的实例。

currID不是私有成员吗?最后一条语句怎么工作的?我有点困惑! - Alpha Mineron
1
@AlphaMineron 这与您在 .cpp 文件中定义私有(或任何)成员函数的方式类似。例如:int MyClass::APrivateFunc() { ... }。为了完全清楚,您需要将 int SomeClass::currId = 0; 放在任何函数之外,同样的方式就像您定义成员函数一样。 - Mark Garcia

1

创建一个常量ID作为int类型,在构造函数初始化列表中进行初始化,如下:

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

希望这能帮到您。

1
你可以在构造函数初始化列表中调用一个函数(在本例中为rand)。现在由你决定如何进行种子处理。

1
如果您的老师允许使用Boost库,那么可以尝试Boost.Uuid。这里有一个例子here。它符合RFC 4122标准。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接