我想問你如何爲以下類寫一個拷貝構造函數(和運算符=)。複製構造函數和動態分配
類節點存儲每個節點的座標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] _new,由舊對象n [1] _old的副本表示。從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的指針設置並沒有其他對象將被創建...
所以拷貝構造函數應該檢查對象是否在過去已經建立或有不...
一些引用計數可能會有所幫助......
'setNode'的定義不合法。只有構造函數可以有初始化器。此外,行不應該都具有相同的縮進級別;縮進應該反映塊的嵌套級別。 – outis 2010-03-06 20:50:59
你也可以考慮重命名'Node :: setNode'和'Node :: n'來描述關係,比如'Node :: setParent'和'Node :: parent'或'Node :: setReferent'和'Node :: referent'。就目前而言,節點和節點的節點之間沒有區別。 – outis 2010-03-06 23:58:33