c ++中的静态计数器

时间:2012-06-04 12:38:01

标签: c++ class static counter

我正在尝试创建一个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,等等。?

5 个答案:

答案 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或其他线程安全的方式