【问题标题】:ID data member in c++ classC++类中的ID数据成员
【发布时间】:2013-03-03 23:50:08
【问题描述】:

我的老师要求我们创建自动生成的ID数据成员,并且一旦建立就不能修改。 最合适的类型是什么? 如果答案是 static const int ID;

如何在它为 const 时自动生成它?

【问题讨论】:

  • 提示:你需要一个非常量静态和一个常量成员。

标签: c++ data-structures types datamember


【解决方案1】:

由于 ID 必须是唯一的,因此应确保两个实例永远不会获得相同的 ID。此外,课堂外的任何人都不应干预 UID 的生成。

首先,在类中定义一个静态字段:

class Data
{
private:
    static int newUID;

(...)
};

// The following shall be put in a .cpp file
int Data::newUID = 0;

然后,在创建每个实例后,它应该采用一个新的 ID 值并递增 newUID 计数器:

class Data
{
(...)
    const int uid;  

public:
    Data()
        : uid(newUID++)
    {
    }

    int GetUid()
    {
        return uid;
    }
};

除了类之外,没有人可以访问内部 newUID,ID 是为每个实例自动生成的,并且您(几乎1)确定没有两个实例具有相同的 ID 号。


1 除非您生成略多于 40 亿个实例

【讨论】:

  • 我对这个高效的代码很满意,而且它运行良好。非常感谢。
【解决方案2】:

这是一个例子:

class SomeClass {
   static int currID;

public:
   const int ID;

   SomeClass() :
      ID(currID++) {  // Initialization list used to initialize ID

   }
};

而且你必须把它放在你的 .cpp 文件中:

int SomeClass::currId = 0;

这使用initialization lists 来达到目的。我们必须这样做,因为它只能在初始化列表中分配给实例中的const 成员。

核心概念是您必须有一个“全局设置”来跟踪将分配给将来创建的实例的 ID。在此示例中为 currID。对于在您的类中创建的每个实例,您将 currID 的值分配为该实例的 ID,然后将其递增 (currID)。通过这种方式,您可以获得具有唯一 ID 的实例。

【讨论】:

  • currID 不是私人会员吗?最后一个语句将如何工作?我有点糊涂了!
  • @AlphaMineron 这类似于您在 [.cpp 文件中] 定义私有(或任何)成员函数的方式。例如。 int MyClass::APrivateFunc() { ... }。为了完全清楚,您将int SomeClass::currId = 0; 放在任何函数之外,与定义成员函数的方式相同。
【解决方案3】:

创建一个 const ID 为 int ,在构造函数初始化列表中对其进行初始化,如

 SomeClass(): id(++staticIncrementingInt){
   ///other stuf here
 }

希望这会有所帮助。

【讨论】:

    【解决方案4】:

    您实际上可以在构造初始化列表中调用一个函数(在本例中为 rand)。 现在由您决定如何播种。

    【讨论】:

      【解决方案5】:

      如果您的老师允许使用 boost 库,请尝试 Boost.Uuid。一个例子是here。它符合RFC 4122

      【讨论】:

        猜你喜欢
        • 2013-01-30
        • 1970-01-01
        • 2014-05-10
        • 2014-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多