なぜ以下がコンパイラエラーをスローするのですか?
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()に逆らいます。