如果你想這是一個拷貝構造函數,簽名應改變接受const
參考:
Stack::Stack(const Stack& StkIn)
{
top = NULL;
numItems = 0;
node* oPtr = StkIn.top;
node* nPtr = top; // this sets nPtr to NULL
while (oPtr != NULL)
{
nPtr->item = oPtr->item; // then you dereference nPtr - initially NULL!!!!
nPtr = nPtr->next;
oPtr = oPtr->next;
}
}
你需要做的一個new node;
在循環內部分配內存,然後設置數據成員。而你並沒有更新top
指向第一個新節點。
退一步,你應該學會如何解決這類問題。在紙面上寫下這樣的:
[oPtr = StkIn.top = NULL]
[oPtr = StkIn.top] ----> [node:{item1,next=NULL]
[oPtr = StkIn.top] ----> [node:{item1,next--]----> [node:{item2,next=NULL]
那是三個測試用例......如果你能證明你自己,你的代碼適用於所有三種,那麼它可能會爲任意數量的列表中的節點的工作。
對於這些,遵循行代碼行,工作了變量將舉行什麼,看看說明書進行正確StkIn
複製到新的內存。例如,最後一個應該產生這樣的:
[top] ----> [node:{item1,next--]----> [node:{item2,next=NULL]
繼/在紙上鍛鍊你的邏輯是對這類問題非常有用....
原因之一,實際上覆制的東西。你的第一次迭代是解引用NULL指針並調用*未定義的行爲*。而複製構造函數不通過地址(指針)傳遞它們的參數,它們通過* reference *。簡而言之,這個拷貝中沒有任何內容是正確的。 – WhozCraig
你可以補充你的完整代碼嗎? – BlackMamba