2009-06-12 11 views
11

デストラクタをどのようにオーバーロードしますか?デストラクタのオーバーロード方法

+2

オーバーロードされたデストラクタの使い方を知っていたのですか、それとも好奇心でしたか? 1つのクラスに対して2つのデストラクタを作成する以外のことをしたい場合は、それを起動して、それを達成する方法について話し合うことができます。 –

+0

それが可能かどうか、それがどのように行動すると思いますか? –

+0

それは誰かが抱く問題です。彼らは、SOがどのくらい速く反応するかを見たいと思っていました。 – Joshua

答えて

31

できません。 C++ではクラスごとにデストラクタが1つしかありません。

あなたができることは、プライベートデストラクタを作成し、デストラクタを新しく面白い方法で呼び出すいくつかのパブリックメソッドを持つことです。

class Foo { 
    ~Foo() { ... } 
public: 
    DestroyFoo(int) { ... }; 
    DestroyFoo(std::string) { ... } 
}; 
+0

それはRAIIを殺すだろうか? – Qberticus

+0

@Qberticus、それはいくつかの点ではそうだろう。簡単なRAIIを持ち、興味深い方法でFooを破壊する追加のクラスを作成することからOPを止めるものはまだありません。OPの情報がなければ、私には分かりません。私はOPがこれを考慮して、その解決策を考慮していることを期待しています。 – JaredPar

+2

それはプライベートです*デストラクタ* ... –

1

あなたはできません!各クラスはデストラクタを1つしか持てません。どうやって複数のことができますか?デストラクタは自動的にトリガされます。どの言語を呼び出すかを言語が知る方法はありません。

しかし、仮想デストラクタは別の問題です。

0

あなたはしません。あるクラスに2つのデストラクタを持つことはできません。

あなたは何を達成しようとしていますか?

1

オーバーロードとは、同じ名前を持つ複数の関数が異なる引数を持つことを意味します。 swap(int &a, int &b)およびswap(double &a, double &b)のようになります。デストラクタは引数をとりません。オーバーロードすると意味がありません。

特定の状況によってオブジェクトを破棄する必要がある場合は、それらの状況をチェックするために、デストラクタに適切なif文が必要です。

3

デストラクタに過負荷をかけたい唯一の理由は、あるデストラクタでいくつかのリソースを解放して別のデストラクタに残したいからです。

基本的に、特定のリソースを解放する必要があるかどうかを示すブール値を追加することで、独自のデストラクタからそのような動作を実現できます。このブール値はコンストラクタや他のメソッドの1つに設定され、デストラクタでは設定されているかどうかをチェックします。それが設定されていない場合は、リソースを解放します。それ以外の場合は、リソースを残しておけば、他のタスクで解放される可能性があります。 (これは、複数のオブジェクト間でリソースを共有すると意味をなさないでしょう)

デストラクタをオーバーロードできないのは、オブジェクトを破棄するときにどのデストラクタで呼び出す必要があるのか​​をあなたのコードが知らないためです。デストラクタを悪く呼び出すのでない限り、あなたはひどく振る舞っています! ;-)

0

デストラクタを決して呼び出さないので、デストラクタをオーバーロードしません。 それはそれの基本的な要点です。 (私たちがクラスで行ったことから)

関連する問題