c ++ const公共字段与getter方法

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对象之间实现赋值,尽管目前我不需要这个功能.

  • 每种方法的优缺点是什么(getter function/const field)?
  • 假设我正在使用'const'方法,有没有办法在不破坏代码的情况下实现赋值运算符?

谢谢,波阿斯

Fer*_*yer 6

我可以将id用作映射中的键(因为复制构造正确初始化了复制对象的id)

你说"正确"是什么意思?默认的复制构造函数将复制ID,无论它是存储在私有成员变量还是公共成员变量中,并且最终会有两个共享相同ID的对象.这可能不是你想要的.

通常,您不应该在C++中使用公共变量,因为它违反了正确的封装.始终使用(inline)getter方法.唯一的缺点是你必须输入更多的字符.

我强烈建议您坚持使用最佳实践并使用具有getter功能的私有字段.

  • 范围常量如何打破封装? (11认同)
  • @Ferdinand:没有冒犯意味着,但我认为永远不要使用公共字段是相当严格的,特别是因为我打算将该特定类用作POD,它可能有很多很多字段.你真的建议为每一个人写一个getter/setter吗? (2认同)

Bo *_*son 5

如果设计表明它永远不应该改变,那么在类中有一个公共成员常量是完全可以的。唯一的 id 似乎就是这种情况。

const 成员禁用赋值的事实对我来说似乎是一个优势。如果您将一个实例分配给另一个实例,则 ID 将不再是唯一的!