我的老师要求我们创建自动生成的ID数据成员,并且一旦建立就不能修改。最合适的类型是什么?如果答案是 static const int ID;
我怎样才能在它是 const 时自动生成它?
我的老师要求我们创建自动生成的ID数据成员,并且一旦建立就不能修改。最合适的类型是什么?如果答案是 static const int 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 号。
这是一个例子:
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。一个例子是here。它符合RFC 4122 。