在C静态计数器++(static counter in c++)

2019-07-29 17:17发布

我试图创建一个Data类,它的对象各自持有一个唯一的ID。

我想第一对象的ID为1,第二个是2,等等。我必须使用static int ,但所有的对象具有相同的ID,而不是1,2,3 ...

这是Data类:

class Data
{
private:
   static int ID;
public:
   Data(){
   ID++;
   }
};

我该怎么办呢所以第一个ID是1,第二个是2,等等..?

Answer 1:

这个:

class Data
{
private:
   static int ID;
   const int currentID;
public:
   Data() : currentID(ID++){
   }
};

除了静态的柜台,你还需要一个实例绑定的成员。



Answer 2:

如果ID是静态的,那么它将对所有的类实例相同的值。

如果你想每个实例有连续的ID值,那么你可以在静态属性与类变量,这样的结合:

class Data
{
private:
   static int ID;
   int thisId;
public:
   Data(){
   thisId = ++ID;
   }
};

int Data::ID = 0;

如果应用程序将是多线程的,那么你就必须把它的东西,如一个并行线程互斥同步。



Answer 3:

函数内的静态变量的初始化允许这样的解决方案可以是这样的

 class Data
 {
    private:
    static int ID ()
    {
       static int ID = 0;
       return ID ++;
    }
    int myId;

    public:
    Data(): myId (ID ())
    {      
    }
 };


Answer 4:

的每个实例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())());


Answer 5:

哪里是实例(非静态)ID在这里? 你需要声明一个新的实例ID字段这样

int m_ID;

然后在你的构造做

Data(){m_ID = ::InterlockedIncrement(&ID);}

在互锁或其他线程安全的方式



文章来源: static counter in c++