我想为某个类的每个对象添加唯一的 ID(在单个会话内)。一种解决方案是使用工厂函数来增加一些静态计数器。一个更简单的解决方案是将此计数器添加到类本身,例如:
class fooWithUniqueId {
public:
fooWithUniqueId() : id(next_id++) {...};
long id;
private:
static long next_id = 0;
}
然而,一个缺陷是,id
字段是公共的,可以由调用者更改,从而违反了其唯一性。传统的(嗯,至少在我看来)是id
private,并使用 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;
}
我更喜欢这种方式,因为我不必一直打电话getId()
每次我需要 id 时,我都可以使用 id 作为映射中的键(因为复制构造正确地初始化了复制对象的 id)。我能想到的一个缺点是我无法在fooWithUniqueId
对象,尽管目前我不需要这个功能。
- 每种方法(getter 函数/const 字段)的优缺点是什么?
- 假设我使用“const”方法,有没有什么方法可以在不破坏代码的情况下实现赋值运算符?
谢谢,波阿斯
我可以使用 id 作为映射中的键(因为复制构造正确地初始化了复制对象的 id)
你所说的“正确”是什么意思?默认的复制构造函数将复制 ID,无论它是存储在私有成员变量还是公共成员变量中,最终都会得到两个共享相同 ID 的对象。这可能不是您想要的。
一般来说,您不应该在 C++ 中使用公共变量,因为它违反了正确的封装。始终使用 (inline
) 吸气剂方法。唯一的缺点是你必须多输入几个字符。
我强烈建议您坚持最佳实践并使用具有 getter 函数的私有字段。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)