次のクラスのコピーコンストラクター(およびoperator =)の書き方をお聞きしたいと思います。
クラスノードは、各ノードの座標x、yと別のノードへのポインタを格納します。
class Node
{
private:
double x, y;
Node *n;
public:
Node (double xx, double yy, Node *nn) : x(xx), y(yy), n(nn) {}
void setNode (Node *nn) : n(nn) {}
...
};
クラスNodesList(std :: vectorから継承)は、動的に割り当てられたすべてのノードを格納します
class NodesList : public std::vector<Node *>
{}
メインプログラム:
int main()
{
Node *n1 = new Node(5,10,NULL);
Node *n2 = new Node(10,10,NULL);
Node *n3 = new Node(20,10,NULL);
n1->setNode(n2);
n2->setNode(n3);
n3->setNode(n2);
NodesList nl1;
nl1.push_back(n1);
nl1.push_back(n2);
nl1.push_back(n3);
//Copy contructor is used, how to write
NodesList nl2(nl1);
//OPerator = is used, how to write?
NodesList nl3 = nl1;
}
各ノードの浅いコピーではなく、各ノードの深いコピーを作成したいと思います。コピーコンストラクターを使用したサンプルコードをお願いできますか?
各ノードは複数回指定できます。3つのノードn[1]、n [2]、n[3]がNodesListnl1に格納されている場合、このような状況を考えてみましょう。
n[1]はn[2]を指します
n[2]はn[3]を指します
n[3]はn[2]を指します
A]コピーコンストラクターはノードn[1]を処理します。古いオブジェクトn[1]_oldのコピーで表される新しいオブジェクトn[1]_newを作成します。n [1]_oldからポイントされたノードn[2]はまだ存在しないため、n[2]_newも作成する必要があります...n1_newからn2_newへのポインタが設定されます。
B]次に、2番目の点n[2]が処理されます。2回作成することはできません。n[2]_newはA]で作成されました。ただし、指定されたノードn [3]は存在しないため、古いオブジェクトn[3]_oldのコピーとして新しいオブジェクトn[3]_newが作成されます。n2_newからn3_newへのポインタが設定されます。
C]ノードn[3]_newはすでに作成されており、n[2]_newです。n3_newからn2_newへのポインタが設定され、他のオブジェクトは作成されません。
したがって、コピーコンストラクタは、オブジェクトが過去に作成されたかどうかを確認する必要があります...
いくつかの参照カウントが役立つ可能性があります...