Почему следующее выдает ошибку компилятора:
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
.
Я понимаю концепцию инварианта;вы хотите проверять состояние класса между каждым открытым вызовом метода.
Однако неизменяемые или константные функции-члены не могут изменять состояние класса (если не было передано this
?), поэтому инвариантные проверкиокружающие эти функции излишни.Инвариантный вызов может быть оставлен в стороне, и бесконечный цикл не появится, что приведет к ошибке компилятора.
Я пришел к этому, поскольку создаю иерархии с объектами, которые определяют:
bool hasParent() const
{
return (parent !is null);
}
использовать эту маленькую функцию легче в классе, но, возможно, и за ее пределами.Но определение его public бросает вызов invariant ().