最近、これに関連する質問をしましたが、言葉遣いがひどく、自分が何をしているのかわかりませんでした。コードをいじる時間があり、この質問がより理にかなっていることを願っています。それにもかかわらず、まだ何かが間違っています。クラス B があります。そのクラスへのポインター (*p)。このポインターのコピーを作成したいだけです(たとえば、qと呼ばれます)。p を削除しますが、p も指していたのと同じ情報への有効なポインター ポインターをまだ持っています。次に、q を削除します。それらを互いに等しく設定しようとすると、問題が発生します
class B
{
public:
B(); ~B();
B(const B &Overloading);
B& B::operator=(const B &Overloading);
vector<*A> stores_a; //class A contains ints, doubles etc. I filled this with
//pointers to class A
void Mr_Clean();
};
B::B() {}
~B::B()
{
Mr_Clean();
}
B::B(const B &Overloading)
{
for(size_t i=0; i<stores_a.size(); i++)
{
stores_A[i]=new A(*Overloading.stores_a[i]);
}
}
B::B& B::operator=(const B &Overloading)
{
if(this!=&Overloading)
{ Mr_Clean();
for(size_t i=0; i<stores_a.size(); i++)
{
stores_A[i]=new A(*Overloading.stores_a[i]);
}
}
return *this
}
void B::Mr_Clean()
{
for(size_t i=0; i<stores_A.size(); i++)
{
delete stores_A[i];
}
}
int main()
{
B *p=new B;
B *q=new B;
// fill some stuff. this is just random stuff I am making up
*q=*p; //compiles then Kaboom at this line
delete p;
delete q;
return 0;
}
代入演算子にはまだ概念的なギャップがあると思います。私は多くのチュートリアルを読みましたが、彼らが言うことをやっているような気がします...
また別の質問として、この例では、B にメンバー int x もあったとします。コピー コンストラクターを呼び出し、代入演算子をオーバーロードしたので、明示的に x=Overloading.x を呼び出す必要がありますか? 技術的には、デフォルトのコピーコンストラクターをオーバーライドしているということですか? ただし、x は単なる普通の int です。