我正在尝试创建一个Data
类,其对象每个都拥有一个唯一的 ID。
我希望第一个对象的 ID 为 1,第二个为 2,等等。我必须使用 a static int
,但所有对象都具有相同的 ID,而不是 1、2、3 ...
这是Data
课程:
class Data
{
private:
static int ID;
public:
Data(){
ID++;
}
};
我该怎么做才能使第一个 ID 为 1,第二个 ID 为 2,等等。
这个:
class Data
{
private:
static int ID;
const int currentID;
public:
Data() : currentID(ID++){
}
};
除了静态计数器之外,您还需要一个实例绑定成员。
如果 ID 是静态的,那么它将对所有类实例具有相同的值。
如果您希望每个实例具有连续的 id 值,那么您可以将静态属性与类变量结合起来,如下所示:
class Data
{
private:
static int ID;
int thisId;
public:
Data(){
thisId = ++ID;
}
};
int Data::ID = 0;
如果应用程序将是多线程的,那么您必须将其与 pthread 互斥锁之类的东西同步。
允许在函数中初始化静态变量,因此解决方案可以是这样的
class Data
{
private:
static int ID ()
{
static int ID = 0;
return ID ++;
}
int myId;
public:
Data(): myId (ID ())
{
}
};
每个实例都Data
需要自己的非静态成员变量来存储其 ID。变量可static
用于存储上次使用的 ID,该 ID 将在 的构造函数中递增Data
。
考虑使用boost 的 uuid来代替static
不是线程安全的计数器:
#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;
std::string id_ = lexical_cast<std::string>((random_generator())());
这里的实例(非静态)ID 在哪里?您需要像这样声明一个新的实例 ID 字段
int m_ID;
然后在你的构造函数中做
Data(){m_ID = ::InterlockedIncrement(&ID);}
以互锁或其他线程安全的方式