【发布时间】:2012-06-07 15:51:49
【问题描述】:
我需要定义一个生成唯一标识符的 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) 行无法编译 (Clang 3.x)。编译器拒绝静态变量的内联初始化。修复很简单,在实现文件中离线初始化它。所以我的课程不能只包含标题,但我可以忍受。
第 (1) 行定义了我的特殊常量实例。不幸的是,编译器失败了,说“Expected parameter declarator”。
我也尝试过:static const Handle kUndefHandle = 0; 但随后编译器会抱怨“变量的 'Handle' 类型不完整”,即使我将它放在子类中。而且我不能像在 Ruby 中那样在 C++ 中重新打开一个类。
我可以通过将该 const 实例声明放在类之外来使其工作。我失去了课程范围,但这是一个小缺点。如果我愿意,我仍然可以使用命名空间。
但是,这仅在我将第 (2) 行中的构造函数公开时才有效。我不希望那样。我不想让程序员用任意值构造句柄。
有什么建议吗?
【问题讨论】:
-
提供对象句柄的常用方法是使用它的指针值,它保证是唯一的。 “未设置”值自然为 NULL。你有想过吗?
-
我当然知道。但是这些值在文件中是可见的,并且必须可以跨文件/机器/网络传输。以这种方式使用指针让我感到不舒服。当不同机器的指针大小不同时,这也会让人头疼。 (是的
int从这方面来说也是一个糟糕的选择。我使用的实际整数类型更好)。
标签: c++ constants instance protected