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

C++ 如何在c+中为类中的每个实例生成唯一id+;?,c++,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 <i

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

}
//这是GameObject.h
类游戏对象
{
公众:
int实例;
GameObject();
void Display();
受保护的:
int-id;
};
//这是GameObject.cpp
#包括“GameObject.h”
#包括
使用名称空间std;
GameObject::GameObject()
{
instances=this->id;//这是生成唯一id的正确方法吗?
}

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

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++) {}
另一种选择是使用:

#包括
使用std::string;
#包括
#包括
#包括
#包括
使用boost::词法转换;
使用boost::uuids::uuid;
使用boost::uuids::random_生成器;
类游戏对象
{
公众:
字符串实例;
GameObject():实例(make_uuid_uuid());
void Display();
私人:
字符串make_uuid_Uid()
{
返回词法转换((random_generator())());
}
};

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


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

请执行以下操作:

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;
类游戏对象
{
公众:
int-id;
GameObject():id(++s_id){}
受保护的:
静态std::原子s_id;
};
//在.cpp文件中:
std::原子游戏对象::s_id;

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

您没有初始化
id
。没有初始化
id
,与发布的代码不会增加(或修改)线程安全性相比,问题不大!它在其他地方被修改,通过使用模板,在主目录中,我应该包括这些吗?这不起作用,因为id链接到其他头文件,并且必须保护id。@W_K,在一个
.cpp
文件中定义
GameObject::id
,它不必受
保护
@W_K:W
保护
有什么问题?@LightnessRacesinOrbit,(不确定你是否在和我说话),但我没有说受
保护
有问题,只是它不是必须的,也不是。@LightnessRacesinOrbit我遵循的设计说明它必须受到保护。它可能很有用。e、 g.计时器implementation@LightnessRacesinOrbit:是的,没错。我的评论有误导性。它特定于OP在示例中显示的代码。OP似乎想识别每一个在实现中看起来像是糟糕设计的游戏对象。@LightnessRacesinOrbit:当然有助于至少提高这一点。
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;