📜  在 C++ 中为对象生成唯一 ID(1)

📅  最后修改于: 2023-12-03 15:23:07.354000             🧑  作者: Mango

在 C++ 中为对象生成唯一 ID

在 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。

方法二:使用 std::unordered_map

另一种生成唯一 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 的方法则相对安全一些,但是需要占用更多的内存。具体选择哪种方法,需要根据具体情况来决定。