我试图创建一个Data
类,它的对象各自持有一个唯一的ID。
我想第一对象的ID为1,第二个是2,等等。我必须使用static int
,但所有的对象具有相同的ID,而不是1,2,3 ...
这是Data
类:
class Data
{
private:
static int ID;
public:
Data(){
ID++;
}
};
我该怎么办呢所以第一个ID是1,第二个是2,等等..?
我试图创建一个Data
类,它的对象各自持有一个唯一的ID。
我想第一对象的ID为1,第二个是2,等等。我必须使用static int
,但所有的对象具有相同的ID,而不是1,2,3 ...
这是Data
类:
class Data
{
private:
static int ID;
public:
Data(){
ID++;
}
};
我该怎么办呢所以第一个ID是1,第二个是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;
如果应用程序将是多线程的,那么你就必须把它的东西,如一个并行线程互斥同步。
函数内的静态变量的初始化允许这样的解决方案可以是这样的
class Data
{
private:
static int ID ()
{
static int ID = 0;
return ID ++;
}
int myId;
public:
Data(): myId (ID ())
{
}
};
的每个实例Data
需要存储其ID其自身的非静态成员变量。 甲static
变量可以被用于存储最后使用的ID将要在的构造被递增Data
。
代替的static
计数器,这是不是线程安全的,可以考虑使用升压的UUID :
#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);}
在互锁或其他线程安全的方式