クラスがあり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
ます