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

时间:2011-02-13 13:24:32

标签: c++ const field getter

我想在某个类的每个对象中添加唯一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个对象之间实现赋值,尽管目前我不需要这个功能。

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

谢谢,波阿斯

2 个答案:

答案 0 :(得分:6)

  

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

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

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

我强烈建议您坚持使用最佳做法并使用具有getter功能的私有字段。

答案 1 :(得分:4)

如果设计显示它永远不会改变,那么在类中保持公共成员常量是完全可以的。一个独特的id似乎就是这种情况。

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