C++ 如何在c+中为类中的每个实例生成唯一id+;?
我曾尝试为类中的所有实例创建唯一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
//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;