我想为一个特定类的每个对象添加唯一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定义为公共的类常量字段:
class fooWithUniqueId {
public:
fooWithUniqueId() : id(next_id++) {...};
const long id;
private:
static long next_id = 0;
}
我更喜欢这种方法,因为我不需要每次调用getId()
获取id,可以将其作为映射中的键(由于复制构造函数正确初始化了复制对象的id)。我能想到的一个缺点是不能在fooWithUniqueId
对象之间实现赋值,虽然目前我不需要这个功能。
- 各种方法的利弊是什么(getter函数/const字段)?
- 假设我使用'const'方法,是否有办法稍后实现赋值运算符而不破坏代码?
谢谢,Boaz