1

クラスがありAます。 A独自のデストラクタがあります。

私は以下のようAに定義Bしています。

class A{
  protected:
    int* array;
  public:
    A(int size){array = new int[size];}
    ~A() { delete [] array;}

}

class B{
 public:
  A x;
}

のデストラクタをどのように定義すればよいBですか?

前もって感謝します。

4

4 に答える 4

7

class で特別なことをする必要はありませんB。この場合、コンパイラが生成したデストラクタは正しいことを行います。

A一方、クラスには代入演算子とコピー コンストラクターがないか、これらを非公開にして無効にする必要があります。コンパイラが生成したものは、インスタンスをコピーまたは割り当てると問題を引き起こしAます (したがって、インスタンスも同様です。3 の規則をB参照してください。

于 2013-03-07T19:38:42.717 に答える
0

のデストラクタを実際に定義する必要はありませんBB手動のクリーンアップが必要なメンバーはありません。のインスタンスBが破棄されると、そのすべてのメンバーのデストラクタが呼び出されます (ユーザー定義のデストラクタがあるかどうかに関係なく)。これは、 のインスタンスがA独自のデストラクタによってクリーンアップされることを意味します。したがって、デフォルトのデストラクタは完全に問題ありませんB

もちろんB、3 つのルールを満たすためのカスタム コピー コンストラクターと代入演算子がありませんが、それは別の問題です。

于 2013-03-07T19:39:46.483 に答える
0

コンパイラが生成したデストラクタが呼び出されると (何もする必要はありません)、A のデストラクタが自動的に呼び出されます。

基本的に、この場合 B を適切に破棄するために何もする必要はありません。

于 2013-03-07T19:40:36.700 に答える
0

デストラクタで何もBする必要はありません。デフォルトのコンストラクターを定義するか、デフォルトのコンストラクターAで既存のコンストラクターを呼び出す必要がありBます

于 2013-03-07T19:40:37.297 に答える