我有几个对象,需要为它们生成一个唯一的标识符,在每个对象的生命周期内不会被更改/重复。
基本上我想为我的对象获取/生成一个唯一的id,就像这样
int id = reinterpret_cast<int>(&obj);
或
int id = (int)&obj;
我理解上面的代码是坏主意,因为int可能不足以存储地址等。
那么从对象中获取唯一标识符的最佳做法是什么?这将是一个可移植的解决方案?
答案 0 :(得分:14)
根据您的“唯一性”要求,有以下几种选择:
就个人而言,只要我能负担得起,我的选择就是UUIDs,因为它们让我心情舒畅,而不必考虑所有的陷阱。
答案 1 :(得分:8)
如果需要唯一标识对象,则可以在构造函数中生成唯一ID:
struct Obj
{
int _id;
Obj() { static int id = 0; _id = id++; }
};
您必须决定如何处理副本/分配(相同的ID - 以上将工作/不同的ID - 您需要一个复制构造函数,可能需要一个static
类成员而不是{ {1}}局部变量)。
答案 2 :(得分:4)
当我研究这个问题时,我很快就找到了 Boost UUID 库(通用唯一标识符http://www.boost.org/doc/libs/1_52_0/libs/uuid/)。但是,随着我的项目的发展,我转而使用 Qt的GUID 库(全球唯一标识符http://doc.qt.digia.com/qt/quuid.html)。
为我学到的一个教训是开始声明你自己的UUID类并隐藏实现,以便你可以切换到你以后找到的任何合适的东西。
我希望有所帮助。
答案 3 :(得分:1)
如果你的对象是一个类,那么你可以有一个静态成员变量,你可以将它变为0.然后在构造函数中将这个值存储到类实例中并增加静态变量:
上课
Indexed
{
public:
Indexed() :
m_myIndex( m_nextIndex++ )
{ }
int getIndex() const
{ return m_myIndex; }
private:
const int m_myIndex;
static int m_nextIndex;
};
答案 4 :(得分:0)
直接使用对象地址作为唯一(对于此运行)标识符并不是一个坏主意。为什么要把它转换成整数?只需将指针与==
比较:
MyObject *obj1, *obj2;
...
if (obj1 == obj2) ...
当然,如果您需要将ID写入数据库等,这将不起作用。在运行之间可以使用相同的指针值。另外,不要重载比较运算符(==
)。
答案 5 :(得分:0)
如果您需要分布式环境的唯一ID,请使用boost::uuid