クラスがあり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ですか?
前もって感謝します。
クラスがあり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ですか?
前もって感謝します。
class で特別なことをする必要はありませんB。この場合、コンパイラが生成したデストラクタは正しいことを行います。
A一方、クラスには代入演算子とコピー コンストラクターがないか、これらを非公開にして無効にする必要があります。コンパイラが生成したものは、インスタンスをコピーまたは割り当てると問題を引き起こしAます (したがって、インスタンスも同様です。3 の規則をB参照してください。
のデストラクタを実際に定義する必要はありませんB。B手動のクリーンアップが必要なメンバーはありません。のインスタンスBが破棄されると、そのすべてのメンバーのデストラクタが呼び出されます (ユーザー定義のデストラクタがあるかどうかに関係なく)。これは、 のインスタンスがA独自のデストラクタによってクリーンアップされることを意味します。したがって、デフォルトのデストラクタは完全に問題ありませんB。
もちろんB、3 つのルールを満たすためのカスタム コピー コンストラクターと代入演算子がありませんが、それは別の問題です。
コンパイラが生成したデストラクタが呼び出されると (何もする必要はありません)、A のデストラクタが自動的に呼び出されます。
基本的に、この場合 B を適切に破棄するために何もする必要はありません。
デストラクタで何もBする必要はありません。デフォルトのコンストラクターを定義するか、デフォルトのコンストラクターAで既存のコンストラクターを呼び出す必要がありBます