【问题标题】:Static counter - how to make ID not change [C++]静态计数器 - 如何使 ID 不变 [C++]
【发布时间】:2017-04-23 17:13:34
【问题描述】:

我试图为每个创建的对象创建一个唯一的 ID,同时还跟踪已创建的对象实例的数量。但似乎当调用析构函数并减少计数器时,ID 会随之改变。

.h

   class Objekt
    {
    public:
        Objekt();
    ~Objekt();

    int ID;
    static int get_counter();

private:
    static int counter;

};

.cpp

#include "Objekt.h"



Objekt::Objekt()
{
    counter++;
    ID = counter;
}


Objekt::~Objekt()
{
    --counter;
}

int Objekt::get_counter()
{
    return counter;
}

【问题讨论】:

标签: c++ static counter


【解决方案1】:

如果您想要一个唯一的 ID,您需要有两个计数器:(1) 活动对象的数量和 (2) 创建的对象数量 [用于创建 ID]。

您的系统将创建具有重复 ID 的对象。

【讨论】:

  • 关于重复 ID 的好处是,只有在创建另一个对象之前没有销毁任何对象时,程序才会正确应用 ID。
【解决方案2】:

将计数器的概念与 ID 分离。添加到班级:

static int currentID;

只更改构造函数:

Objekt::Objekt()
{
    counter++;
    currentID++;
    ID = currentID;
}

Counter 现在将保存活动对象的计数,而 currentID 将保存所有已创建对象的计数(也适用于获取 ID)。

【讨论】:

    【解决方案3】:

    您编写它的方式 ID 实际上是一个对象实例编号,最终将被重用和弄乱。您可能希望改用非递减的相当大的 (uint64) 计数器,或者使用由::boost::uuid for example 生成的更真实的 ID。

    class Objekt
    {
        public:
        Objekt(): m_id(::boost::uuids::random_generator()()) {}
    
        public:
        ~Objekt() {}
    
        private: ::boost::uuids::uuid const m_id;
    };
    

    【讨论】:

      【解决方案4】:

      当调用析构函数并且计数器减少时,ID 随之改变。

      我建议你使用两个计数器,ctor 和 dtor。

      class Objekt
      {
      public:
          Objekt()
          {
             ctorCount++;
             ID = ctorCount;
          }
      
          ~Objekt
          {
             dtorCount++;
          }
          int activeInstances() { return (ctorCount - dtorCount); }
          int maxInstanceId()   { return (ctorCount); }
          int staleInstances()  { return (dtorCount); }
      
      private:    
         static int ctorCount;  // accessible by all instances
         static int dtorCount;  
      
      };
      
      
      
      int Objekt::ctorCount = 0;
      int Objekt::dtorCount = 0;
      

      现在删除实例后,ID 不会更改,并且下一个 ID 始终是唯一的。

      请注意,ID 之间可能会出现间隔。数字 activeInstances() 将是正确的,但不会计算到特定 ID,也不会计算到最大值(可由 maxInstanceId() 访问)。

      【讨论】:

        猜你喜欢
        • 2012-06-08
        • 2018-09-15
        • 1970-01-01
        • 2011-12-08
        • 1970-01-01
        • 2015-06-28
        • 1970-01-01
        • 2020-03-31
        • 1970-01-01
        相关资源
        最近更新 更多