2010-05-19 62 views
3

我将使用下面的(简单)接口作为一个例子:const函数和在C++接口

struct IObject 
{ 
    virtual ~IObject() {} 

    virtual std::string GetName() const = 0; 
    virtual void ChangeState() = 0; 
}; 

从逻辑上讲,GetName应该是一个const成员函数而ChangeState不应该。

尽管我目前看到的所有代码都不遵循这个逻辑。即上述示例中的GetName不会被标记为const成员函数。

这是懒惰/粗心还是有正当理由呢?在逻辑上要求我的客户执行const成员函数时,我的主要缺点是什么?


编辑:感谢您的答复大家。我认为这几乎是一致的:懒惰/无知是我所看到的原因。

+1

无能/懒惰/不小心 – 2010-05-19 16:39:28

+6

不要忘记无知 - 在我的经验糟糕的代码的主要原因。 – 2010-05-19 16:43:25

+1

@尼尔:不幸的是我必须同意......我现在正在咆哮:p – 2010-05-19 16:58:45

回答

9

我认为这是懒惰/粗心。 GetName()应该对该对象的状态没有影响,并且IObject的合同应明确说明该事实。

如果继承类被强制让GetName()拥有(隐藏!)副作用,他们总是可以声明相应的字段为mutable

+2

我认为人们忘记了'const'并不是要说对象的内部状态不应该改变,而是外部状态不应该改变。我应该能够存储一个实例的副本,调用const函数,并且原始和副本仍然应该相等。假设平等实际上意味着平等,其他任何事情都可以改变 – 2010-05-19 17:00:20

+0

@Noah Roberts:也想象一下像缓存。更改缓存不会改变外部状态,并且在const方法中是安全的。 – mmmmmmmm 2010-05-19 17:05:49

+0

+1提及'mutable'的原因。 – 2010-05-19 18:47:47

5

这是懒惰/粗心还是有正当理由呢?

前者。 如果你真的没有看到任何代码这样做,立即得到一份新工作

什么是我强迫我的客户来实现const成员函数,当他们在逻辑上呼吁的主要缺点是什么?

它可以让编译器发现漏洞共同在编译时。 (没有什么比在编译时,一切都在于你的办公桌上未能发现错误的更好,不会在客户端的站点失败。)


十几年前,不久后我加入了一个新的公司,并得到了黑客攻击他们的一个项目,我发现应该是const的方法不是,阻止我的一些const正确的代码进行编译。我认为只是将我的const丢掉,然后继续前进,但我自己却不能这样做。
所以我做了const的方法 - 只是发现它调用了其他方法,它本应该是const的,但它们都不是。所以我改变了他们 - 只是为了发现...
最后,我花了好几天的时间寻找所有的项目,增加const左右。
同事们嘲笑我 - 直到我向他们展示了编译器发现的一些错误,因为我添加了const。有趣的是,之后没有人花时间进行彻底调查的一些长期存在的错误不再可以重现。

+7

+1没有什么比非常量正确代码的修复常量正确性更具灵魂破坏力了。 – 2010-05-19 16:39:32

+1

@尼尔,如此正确 - 层叠效应变成了悲伤的瀑布。 – 2010-05-19 16:42:44

+0

呃。我只能想象一个庞大的代码基地的连锁反应...... – 58gh1z 2010-05-19 16:47:14