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