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,因为它在当前实例存在期间是唯一的,而且它有一定的范围,这取决于我的系统,所以我避免了主体中的类型溢出。无论如何,谢谢你的回答!(如果你对这个“这个”解决方案有什么要说的,我想听听)。