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