ディープコピーを含むクラスの1つに、コピーコンストラクターに複数のパラメーターが必要な状況があります。
基本的に問題は、オブジェクトにポインタを介して追跡する必要のある別のオブジェクトが含まれていることですが、通常のディープコピーでは、ポインタ値のみがコピーされ、新しいオブジェクトの正しいメモリ位置はコピーされません。
通常のコピーコンストラクターを無効にし、2つのパラメーターを持つバリアントを使用することで、オブジェクトを正しくディープコピーできます。
[編集]:私のコードを見ると、他の場所でもいくつかの場所で使用しているので、私よりもさらに一般的であるように思われます。
これは好奇心旺盛な人のためのコードサンプルです(これは単純化されたバージョンであり、実際にはもう少し複雑です)
//-----------------------------------------------------------------------------
scan_point::scan_point(scan_point const& rhs, simulation* sim_)
: m(rhs.m), sim(sim_)
//-----------------------------------------------------------------------------
{
}
-
simulation_(simulation_ const& rhs)
{
//...
for(typename ContainerType::const_iterator it = rhs.spContainer->begin(), endIt = rhs.spContainer->end();
it != endIt; it++)
{
spContainer->push_back(new scan_point(*it, this));
}
}
-
コピー中の苦痛を軽減するために、ディープコピーを可能にするsmart_ptrクラスを使用し、(この場合は具体的に)メンバーを構造体に埋め込んで、コンパイラが他のすべてのメンバーのコピーを自動生成するようにします(短い試みについてはを参照してください)例:https ://stackoverflow.com/questions/469696/what-is-your-most-useful-cc-utility/1609496#1609496 )。