我想在某个类的每个对象中添加唯一ID(在单个会话中)。一种解决方案是使用工厂函数来增加一些静态计数器。一个更简单的解决方案是将此计数器添加到类本身,例如:
class fooWithUniqueId {
public:
fooWithUniqueId() : id(next_id++) {...};
long id;
private:
static long next_id = 0;
}
然而,一个缺陷是id
字段是公共的,并且可以被调用者更改,从而违反其唯一性。传统的(好吧,至少在我看来)是使id
私有,并使用getter函数来访问它,因此:
class fooWithUniqueId {
public:
fooWithUniqueId() : id(next_id++) {...};
long getId() const { return id; };
private:
long id;
static long next_id = 0;
}
但我正在考虑采用不同的方法。我可以将id设为const公共类字段:
class fooWithUniqueId {
public:
fooWithUniqueId() : id(next_id++) {...};
const long id;
private:
static long next_id = 0;
}
我更喜欢这种方式,因为每次我需要id时都不必一直调用getId()
,我可以在地图中使用id作为键(因为复制构造正确地初始化了id的id复制对象)。我能想到的一个缺点是我不能在fooWithUniqueId
个对象之间实现赋值,尽管目前我不需要这个功能。
谢谢,波阿斯
答案 0 :(得分:6)
我可以将id用作映射中的键(因为复制构造正确初始化了复制对象的id)
“正确”是什么意思?默认的复制构造函数将复制ID,无论它是存储在私有成员变量还是公共成员变量中,并且最终会有两个共享相同ID的对象。这可能不是你想要的。
通常,您不应该在C ++中使用公共变量,因为它违反了正确的封装。始终使用(inline
)getter方法。唯一的缺点是你必须输入更多的字符。
我强烈建议您坚持使用最佳做法并使用具有getter功能的私有字段。
答案 1 :(得分:4)
如果设计显示它永远不会改变,那么在类中保持公共成员常量是完全可以的。一个独特的id似乎就是这种情况。
const成员禁用赋值这一事实对我来说似乎是一个优势。如果您将一个实例分配给另一个实例,则ID将不再是唯一的!