13

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

4

5 回答 5

22

这个:

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

除了静态计数器之外,您还需要一个实例绑定成员。

于 2012-06-04T12:41:25.323 回答
13

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

如果您希望每个实例具有连续的 id 值,那么您可以将静态属性与类变量结合起来,如下所示:

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

int Data::ID = 0;

如果应用程序将是多线程的,那么您必须将其与 pthread 互斥锁之类的东西同步。

于 2012-06-04T12:39:58.240 回答
3

允许在函数中初始化静态变量,因此解决方案可以是这样的

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

    public:
    Data(): myId (ID ())
    {      
    }
 };
于 2016-03-05T14:38:54.720 回答
1

每个实例都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())());
于 2012-06-04T12:41:34.013 回答
0

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

int m_ID;

然后在你的构造函数中做

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

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

于 2012-06-04T13:29:56.777 回答