1

次のようなオブジェクトのデストラクタがあるとします。

anObject::~anObject()
{
    _functionCalledfromDestructor=1; //this sets the flag = 1
    functionCall(); //this function does something different than usual
                    //on seeing the flag
}

私の質問:

デストラクタでのコーディングのこのスタイル/方法は良い習慣ですか?

4

4 に答える 4

10

このような「隠しチャネル」は常に悪い考えです。関数の動作は、非表示状態に依存するべきではありません。関数に引数を与えてから、ある値をデストラクタに渡し、別の値を他の場所に渡すことができます。必要に応じて、より一般的なケースにデフォルト値を使用できます。

于 2012-07-18T19:08:35.580 に答える
7

デストラクタでのコーディングのこのスタイル/方法は良い習慣ですか?

関数が呼び出された場所に応じて 2 つの異なることを行う場合、関数は1 つではなく 2 つになります。2 つの関数を実際には 2 つの関数にすれば、この質問をする必要はありません。

于 2012-07-18T19:07:35.220 に答える
4

一般的に、いいえ。次のようにすると良いと思います。

class anObject 
{
private:
  void doSomethingInternal(bool fromDestructor) {...}
public:
  void doSomething() {doSomethingInternal(false);};
  virtual ~anObject() { doSomethingInternal(true); };
}
于 2012-07-18T19:09:33.863 に答える
0

例外がスローされる可能性があるため、デストラクタ内で関数を呼び出すことは一般的に良い方法とは見なされません。これにより、メモリが正しくクリーンアップされず、デストラクタでの例外の動作が未定義になります。

デストラクタでの例外のスローに関する詳細は次のとおりです。

デストラクタで投げたときのSP

あなたの場合、パブリックインターフェイスを介して明確に定義されたクリーンアップは、より良い方法です。たとえばDispose 、クリーンアップを行うメソッドを提供できます。

次のようなものを考えてみましょう (疑似コード):

public:
    void Dispose()
    {
        bool isDestructing = true;
        functionCall(isDestructing);
    }
于 2012-07-18T19:10:20.120 に答える