📅  最后修改于: 2023-12-03 15:23:07.354000             🧑  作者: Mango
在 C++ 中,我们可以为对象生成唯一的 ID 来标识它们,这在许多场合下都非常有用,比如对象池、对象比较等等。
我们可以使用一个静态计数器来为每个对象生成一个唯一的 ID。具体实现如下:
class Object {
public:
Object() {
id = ++count; // 为对象生成唯一 ID
}
int getID() const {
return id;
}
private:
int id;
static int count; // 静态计数器
// 禁止拷贝构造函数和赋值运算符
Object(const Object&);
Object& operator=(const Object&);
};
int Object::count = 0;
上述代码中,我们使用了一个静态计数器 count
来记录生成的对象数目。每当生成一个新对象时,就通过 ++count
为其生成一个唯一的 ID。
使用上述方法,我们可以在任何地方通过 getID()
方法获取对象的唯一 ID。
另一种生成唯一 ID 的方法是使用 std::unordered_map
来映射对象指针和唯一 ID。具体实现如下:
#include <unordered_map>
class Object {
public:
Object() {
static int nextID = 1; // 初始唯一 ID
id = nextID++; // 为对象生成唯一 ID
idMap[this] = id; // 将对象指针和唯一 ID 映射起来
}
int getID() const {
return idMap[this];
}
private:
int id;
// 将对象指针和唯一 ID 映射起来
static std::unordered_map<const Object*, int> idMap;
// 禁止拷贝构造函数和赋值运算符
Object(const Object&);
Object& operator=(const Object&);
};
std::unordered_map<const Object*, int> Object::idMap;
上述代码中,我们使用了一个静态 unordered_map idMap
来映射对象指针和唯一 ID。当生成一个新对象时,我们先从静态变量 nextID
中获取唯一 ID,并将其加一。然后,我们将对象指针和唯一 ID 映射起来,以备后续的查找操作。
使用上述方法,我们可以在任何地方通过 getID()
方法获取对象的唯一 ID。
以上是两种为对象生成唯一 ID 的方法,各有优缺点。使用静态计数器的方法简单实用,但是需要注意多线程安全。而使用 std::unordered_map 的方法则相对安全一些,但是需要占用更多的内存。具体选择哪种方法,需要根据具体情况来决定。