C++ 类实例的唯一id
我有一门课是这样的:C++ 类实例的唯一id,c++,class,identifier,C++,Class,Identifier,我有一门课是这样的: class ExampleClass { private: int _id; string _data; public: ExampleClass(const string &str) { _data = str; } ~ExampleClass() { } //and so on... } 如何在不使用全局变量的情况下为类的每个实例添加唯一(!)整数标识符(_id)?使用私有
class ExampleClass {
private:
int _id;
string _data;
public:
ExampleClass(const string &str) {
_data = str;
}
~ExampleClass() {
}
//and so on...
}
如何在不使用全局变量的情况下为类的每个实例添加唯一(!)整数标识符(_id)?使用私有静态成员int,在类的所有实例中共享。 在构造函数中的static int中,只需递增它,并将它的值保存到id成员
class ExampleClass {
private:
int _id;
string _data;
static int counter=0;
public:
ExampleClass(const string &str) {
_data = str;
id=++counter;
}
更新:
class ExampleClass {
private:
int _id;
static int idProvider;
public:
ExampleClass(const string &str)
: _id(++idProvider)
{}
}
int ExampleClass::idProvider = 0;
您需要在复制构造函数和运算符=中考虑您想要的行为(取决于您的需要,新对象或相同的对象) 您可以在类中隐藏静态数据,它将提供唯一的id 示例:
class ExampleClass {
private:
int _id;
static int idProvider;
public:
ExampleClass(const string &str)
: _id(++idProvider)
{}
}
int ExampleClass::idProvider = 0;
逻辑是每次您创建
ExampleClass
对象时,它都会增加idProvider
,然后将其作为唯一id分配给您的id
“您不能”是简短的答案,除非您的int
足够宽,可以容纳指针,并且您使用了this
@SamVarshavchik中的丑陋类型,从“this”到int的每一次转换都是唯一的吗?根据这个宇宙中的数学规则,只要this
是唯一的,并且int
足够宽,可以容纳一个int。根据定义,指向最派生对象的指针就是它的唯一ID。您可以将其强制转换为uintpttr\u t
,但int
可能太小。实际上是的,应该足够了。“承包商”?哈哈…:-)。。。附言:我不是选民though@WhiZTiM谢谢,但是答案很好。我是第一个没有编译的:我有这个想法,但问题是我不知道数据集有多大。当然,我可以希望_id足够大,可以保存很长的数字…@kekyc,然后使用std::uint64_t
(通常是无符号的long
)。。。其最大值约为18446744073709551615
。。。如果您的数据集大于此值。。。。然后你可能想重新考虑你的设计整体。。。也许使用UUID?@WhiZTiM我最终决定将“this”指针强制转换为_id,因为它在当前实例存在期间是唯一的,而且它有一定的范围,这取决于我的系统,所以我避免了主体中的类型溢出。无论如何,谢谢你的回答!(如果你对这个“这个”解决方案有什么要说的,我想听听)。