如何在c ++中为类中的每个实例生成唯一的id?

时间:2013-02-12 11:28:42

标签: c++

我试图为我班级中的所有实例创建唯一的id,但这似乎在以后尝试编译程序时会导致错误。这是我为类编写的代码:

//this is GameObject.h
class GameObject
{
public:

    int instances;
    GameObject();
    void Display();
protected:
    int id;
};

//this is GameObject.cpp
#include "GameObject.h"
#include <iostream>

using namespace std;


GameObject::GameObject()
{
    instances = this->id; //is this the correct way to generate the unique id?

}

3 个答案:

答案 0 :(得分:6)

做这样的事情:

class GameObject
{
public:
    int id;
    GameObject() : id(++s_id) {}
protected:
    static std::atomic<int> s_id;
};

// in the .cpp file:
std::atomic<int> GameObject::s_id;

这样,构造的每个对象将从1开始获取下一个id(因为默认情况下静态将初始化为零)。你从什么价值开始并不重要。在编写复制构造函数,赋值运算符等时,您可能需要注意。最后,请注意原子类型是C ++ 11的一部分;如果你没有它的支持你可以说“提升”而不是“标准”。如果您需要,任何一个版本都会为您提供线程安全。

答案 1 :(得分:4)

不,GameObject的每个实例都有自己的(未初始化的)id实例。需要有一个共享的递增id实例,可用于GameObject的所有实例。实现此目的的一种机制是使用static类变量。如果涉及线程,则需要同步对static变量的访问:

class GameObject
{
protected:
    static int id;
};

int GameObject::id; // defaults to zero and should be added to
                    // exactly one .cpp file only.

GameObject::GameObject() : instances(GameObject::id++) {}

另一种方法是使用boost::uuid

#include <string>
using std::string;

#include <boost/lexical_cast.hpp>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
using boost::lexical_cast;
using boost::uuids::uuid;
using boost::uuids::random_generator;

class GameObject
{
public:
    string instances;
    GameObject() : instances(make_uuid_());
    void Display();
private:
    string make_uuid_()
    {
        return lexical_cast<string>((random_generator())());
    }
};

答案 2 :(得分:2)

这是不正确的,因为id仅具有不确定值,因为它未初始化)并非唯一值。

您可以将对象的地址作为唯一标识符。 C ++中的每个对象都放在不同的地址。但是,如果您需要以这种方式识别每个对象,那么您的设计就会出现问题。