2012-01-26 24 views
1

私はC++でバイナリツリーを実装しようとしています。私はかなり新しい言語です。構造体とデストラクタが何であるか理解していますが、ネストされたクラス/構造体がどうなるかはわかりません。C++とデストラクタ(ネストされたクラスと一般的な質問)

私の実装では、私のバイナリノードのネストされた構造体があります。この構造体は独自のデストラクタを必要とするか、バイナリツリー自体のデストラクタが呼び出されると、すべてのノードが削除されます。構造体をクラスに変更すると答えが変わるのですか?

また、クラスで "new"を呼び出すと、デストラクタで "delete"を呼び出す必要があると言われました。初期化リストでクラス(つまりclass:array({0}))の配列を初期化すると、デストラクタで[]配列を削除する必要がありますか?

答えて

1

あるクラス(または構造体)を別のクラスに入れ子にしても、オブジェクトの存続時間には影響しません。それが行うことは、クラスの名前のスコープと、囲みクラスのプライベートメンバーへのアクセスを提供することだけです。だからあなたのツリーノードはツリークラスにネストされているだけで自動的には破壊されません。

ツリー自体が破棄されたときにツリーのノードを破棄したい場合は、そのツリーのデストラクタがそのノードを確実に破棄するようにする必要があります。 newでノードを手動で割り当てる場合は、デストラクタでdelete(またはdelete[])を使用してください。あるいは、std::auto_ptr(またはC++ 11ではstd::unique_ptr)のようなものを使用することができます。これは、独自のデストラクタでクリーンアップを行い、deleteコールを書く必要はありません。

構造体をクラスに変更しても、実行時の動作には影響しません。 C++の構造体とクラスの唯一の違いは、構造体が暗黙的にpublic:で始まり、クラスの本体が暗黙的にprivate:で始まることです。

0

C++では、クラス/構造体のデストラクタを定義する必要はありません。 structをクラスに変更しようとすると、デストラクタに変更はありません。 しかし、プログラミング言語としては、新しいメモリを呼び出すと、それを自分で削除しなければならないということは良いことです。 もしネストされたクラスを定義しようとするなら、そのクラスのデストラクタを作るのも良いです。

配列のdelete []に​​は使用する必要はありません。

関連する問題