为什么以下会引发编译器错误:
class A
{
public:
int f() const
{
return 5;
}
protected:
invariant()
{
assert (f() == 5);
}
}
main.d(14): Error: cannot call public/export function f from invariant
.
我理解不变的概念;您想在每次公开调用方法之间检查类的状态。
但是,不可变或 const 成员函数不能改变类的状态(除非this
通过了?),所以围绕这些函数的不变检查是多余的。可以将不变量调用放在一边,并且不会出现无限循环,从而导致编译器错误错误。
自从我使用对象创建层次结构以来,我就想到了这一点,这些对象定义:
bool hasParent() const
{
return (parent !is null);
}
在课堂内使用这个小功能更容易,但也可能在课堂外使用。但是将其定义为 public 违反了 invariant()。