我目前正在編寫拷貝構造函數/賦值運算符的雙向鏈表類和有問題。從「常量DListNode」沒有合適的轉換功能「DListNode *」存在雙向鏈表拷貝構造函數
DoublyLinkedList.h
#include <cstdlib>
#include <iostream>
using namespace std;
class DoublyLinkedList; // class declaration
// list node
class DListNode {
private: int obj;
DListNode *prev, *next;
friend class DoublyLinkedList;
public:
DListNode(int e=0, DListNode *p = NULL, DListNode *n = NULL)
: obj(e), prev(p), next(n) {}
int getElem() const { return obj; }
DListNode * getNext() const { return next; }
DListNode * getPrev() const { return prev; }
};
// doubly linked list
class DoublyLinkedList {
protected: DListNode header, trailer;
public:
DoublyLinkedList() : header(0), trailer(0) // constructor
{ header.next = &trailer; trailer.prev = &header; }
DoublyLinkedList(const DoublyLinkedList& dll); // copy constructor
~DoublyLinkedList(); // destructor
DoublyLinkedList& operator=(const DoublyLinkedList& dll); // assignment operator
// return the pointer to the first node
DListNode *getFirst() const { return header.next; }
// return the pointer to the trailer
const DListNode *getAfterLast() const { return &trailer; }
// return if the list is empty
bool isEmpty() const { return header.next == &trailer; }
int first() const; // return the first object
int last() const; // return the last object
void insertFirst(int newobj); // insert to the first of the list
int removeFirst(); // remove the first node
void insertLast(int newobj); // insert to the last of the list
int removeLast(); // remove the last node
};
// output operator
ostream& operator<<(ostream& out, const DoublyLinkedList& dll);
這是一個補充的頭文件,這裏節點和鏈接列表類都被聲明。我注意到DoublyLinkedList(header和trailer)的受保護類成員不是DListNode指針,而是實際的DListNode值;更多的一點。
在DoublyLinkedList.cpp
DoublyLinkedList::DoublyLinkedList(const DoublyLinkedList& dll)
{
// Initialize the list
header.next = &trailer; trailer.prev = &header;
DListNode* iter = dll.header; // PROBLEM LINE
if (this != &dll) {
while (iter != nullptr) {
insertLast(iter->obj);
iter = iter->next;
}
}
}
我的拷貝構造函數我試圖解決這個問題很多不同的方式,有和沒有編輯的頭文件。我不能將標題和預告片更改爲DListNode *,因爲它們不允許進行更改,並且將其更改爲非指針將意味着我無法遍歷鏈接列表;所以我現在處於僵局。因爲我無法更改操作數的數據類型,所以我不知道如何解決錯誤。我認爲這可能與dll被作爲常量引用傳遞有關,但即使擺弄這些也沒有多大作用。我一直在看這幾個小時,似乎無法讓它工作。感謝您提前提供任何幫助!
'DListNode const * iter =&dll.header'怎麼樣?' – Quest