3

我试图为我的类中的所有实例创建唯一的 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?

}
4

3 回答 3

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;

这样,每个构造的对象都会得到下一个id,从1开始(因为static默认会初始化为零)。您从什么值开始可能并不重要。在编写复制构造函数、赋值运算符等时可能需要小心。最后,注意 atomic 类型是 C++11 的一部分;如果你不支持它,你可以在那里说“boost”而不是“std”。如果您需要,任何一个版本都会为您提供线程安全性。

于 2013-02-12T11:36:34.173 回答
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())());
    }
};
于 2013-02-12T11:31:20.317 回答
2

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

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

于 2013-02-12T11:31:21.360 回答