c ++类中的ID数据成员

时间:2013-03-15 10:05:28

标签: c++ data-structures types datamember

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

如何在const时自动生成它?

5 个答案:

答案 0 :(得分:7)

由于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亿个实例

答案 1 :(得分:2)

以下是一个例子:

class SomeClass {
   static int currID;

public:
   const int ID;

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

   }
};

你必须将它放在你的.cpp文件中:

int SomeClass::currId = 0;

这使用initialization lists来完成这个伎俩。我们必须这样做,因为它只能在初始化列表中,您可以在其中分配给实例中的const成员。

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

答案 2 :(得分:1)

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

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

希望这有帮助。

答案 3 :(得分:1)

您实际上可以在构造初始化列表中调用函数(在本例中为 rand )。 现在由你决定如何种下它。

答案 4 :(得分:1)

如果您的老师允许提升库,请尝试Boost.Uuid。一个例子是here。它符合RFC 4122