2016-04-19 5 views
1

私の教授は、クラス不変式に敬意を払って整形された状態を維持するアサーション(check_inv())を使用するのが適切かどうかを判断する練習をしました。C++でのassert()の適切な使用

私はクラスinvariantをチェックする必要があるときは分かりませんが、私は彼のコンストラクタからオブジェクトを返す前にクラスの不変をチェックするのが良い練習であることを知っていますが、私は完全には分かりません。

これは試験のテキストです:

iは不変クラスを確認してください

class C 
{ 

    public: 

     bool check_inv() const 
     { 
      // Implementation of class invariant code 
     } 

     C(int a, int b) 
     { 
      // Implementation of class constructor. 
     } 
     void foo(C& y) 
     { 
      // Implementation of method foo. 
     } 
     void bar(const C& y) 
     { 
      // Implementation of method bar. 
     } 
     void ying(const C& y) 
     { 
      // Implementation of method ying. 
     } 
     void yang(const C& y) const 
     { 
      // Implementation of method yang. 
     } 
     ~C() 
     { 
      // Implementation of class destructor. 
     } 
     static void zen(int i, double d) 
     { 
      //Implementation of method zen. 
     } 
// ... Some other code ... 
}; // class C 

EDIT:これは宿題に関するものではありません。例を使ってアサーションの機能を理解するだけです。

+2

これは宿題であるため、このトピックをオフトピックとして閉じるよう投票しています。 – Benoit

+1

@Benoitそれは、それ自体が近い理由ではありません。 http://meta.stackexchange.com/questions/10811/how-do-i-ask-and-answer-homework-questions –

+2

本当に安全にしたいのであれば、毎回あらゆる機能の開始時にチェックすることができますオブジェクトを変更した可能性のある関数を残します。 –

答えて

2

オブジェクトのライフサイクルを考えてください:コンストラクタによって作成され、constメンバ関数によって検査され、非constメンバ関数によって変更され、最終的にはデストラクタによって破棄されます。したがって、クラス不変式が成立する限り、それはコンストラクタの最後と非constメンバ関数の最後で満たされなければなりません。これは不変量がどこでも満足できることを保証するのに十分です。関数への入力時にそれをチェックしても、クラスは堅牢になりません。外部からの上書きを検出するかもしれませんが、それはクラスが提示する抽象化の一部ではありません。それでは、各コンストラクタの終わりと、各非constメンバ関数の最後に不変式をチェックしてください。

+0

大丈夫です、ありがとうございました!私はまた、パラメータによって渡された非constオブジェクトのinvariantもチェックする必要がありますか?たとえば "foo"のメソッドで "y"の不変条件をチェックする必要がありますか? 最後に、静的メソッドに対しても同じように振る舞うべきですか? –

+0

@n_denny - オブジェクトが何らかの形で壊れてしまう恐れから、アサーションを追加する場合は、どこにでも置くことができます。オブジェクトの**メンバー関数**がオブジェクトの状態を破壊しないようにするための規律としてアサーションを追加する場合、参照渡しされたオブジェクトをチェックすることで何が得られますか?静的メンバー関数で何かをチェックすることによって得られますか? –

0

デストラクタ関数以外の他のすべてのパブリッククラスメンバ関数でクラス不変式をチェックする必要があります。関数を入力した後、関数を終了する前に2回チェックしてから、この2つのプロセスの間にsth不変量にする。

+0

同意しない。 ctorの最後に不変式をチェックしない理由は何ですか?それはそこで果たされるべきです。それはいつでも呼び出すことができるので、dtorには当てはまらないかもしれませんが、それは別のことです。 –

+0

@WernerHenzeはい、そうです。削除します。次に、dtorの違いは何ですか? – loafbit

+0

オブジェクトを変更する場合は、有効な不変式で始まる状況が発生している可能性があります。その後、中断してから再確認してください。 invariantが真でないときに例外が発生し、プログラムがオブジェクトを終了または削除する必要がある場合、dtorが呼び出されます。 dtorはそれを処理する必要があります。もちろん、オブジェクトによっては、dtorがinvariantが真でないオブジェクトと決して呼ばれないことを保証することができます。 –