我想问你如何为以下类编写一个复制构造函数(和 operator = )。
类 Node 存储每个节点的坐标 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] 存储在 NodesList nl1 中时:
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] 然后处理第二个点n[2]。它不能被创建两次,n[2]_new 是在 A] 中创建的。但是指向的节点 n[3] 不存在,因此创建了新对象 n[3]_new 作为旧对象 n[3]_old 的副本。从 n2_new 到 n3_new 的指针被设置。
C] 节点 n[3]_new 已经创建并且 n[2]_new。从 n3_new 到 n2_new 的指针已设置,不会创建其他对象...
所以复制构造函数应该检查对象是否在过去创建过或者没有...
一些引用计数可能会有所帮助......