我试图为我班级中的所有实例创建唯一的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?
}
答案 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 ++中的每个对象都放在不同的地址。但是,如果您需要以这种方式识别每个对象,那么您的设计就会出现问题。