我需要定义一个生成唯一标识符的C++类。这个想法是,每个可见类的每个实例都将被一个唯一的整数值标记。我们称之为实例的“句柄”。该句柄在系统中的所有实例中必须是唯一的。使用受保护的构造函数的C++常量实例?
某些实例可能与其他实例有关,在这种情况下,它们的类定义了一个成员来存储其亲属的句柄。
但并非所有的实例都有一个亲戚。所以我需要一个特殊的句柄值来表示一个“未定义”的亲戚。
我需要帮助来定义该特殊实例。这里是我的尝试:
class Handle {
public:
Handle(): mValue(newValue()) {};
static const Handle kUndefHandle(0); // (1)
protected:
Handle(int val): mValue(val) {}; // (2)
int mValue;
static int mNextValue = 1000; // start at 1000. (3)
static int newValue() { return mNextValue++; }
};
注:
线(3)不编译(锵3.X)。编译器拒绝静态变量的内联初始化。修复很简单,在实现文件中离线初始化它。所以我的课不能只是标题,但我可以忍受。
line(1)定义了我的特殊常量实例。不幸的是,编译器失败,说“预期的参数声明”。
我也试过:static const Handle kUndefHandle = 0;
但随后的编译器抱怨“变量具有不完全类型‘拉手’”,即使我把它放在一个子类。我不能像在Ruby中那样用C++重新打开一个类。
我可以通过在类之外放置该const实例声明来使其工作。我失去了课堂范围,但这是一个小缺点。如果我在意,我仍然可以使用命名空间。
但是,这只适用于如果我建立行(2)公共构造函数。我不想那样。我不想让程序员用任意值构造句柄。
有什么建议吗?
的常用方法提供的句柄目的是利用其指针值,这是保证是唯一的。 “unset”值自然是NULL。你有想过吗? –
当然,我有。但是这些值在文件中是可见的,并且必须可以跨文件/机器/网络传输。我觉得用这种方式使用指针会感到不舒服。当指针大小在不同机器上不同时,这也会导致头痛。 (是的'int'在这方面也是不好的选择,我使用的实际整型更好)。 –