对于双向链表复制构造函数,不存在从 "const DListNode" 到 "DListNode *" 的合适转换函数
no suitable conversion function from "const DListNode" to "DListNode *" exists for doubly linked list copy constructor
我目前正在为双重链表类编写复制构造函数/赋值操作符,并且遇到问题。
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(头和尾)的受保护类成员不是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*,因为他们不允许被改变,并改变iter到一个非指针将意味着我不能遍历链表;所以我现在陷入了僵局。因为我不能改变操作数的数据类型,所以我不确定如何修复这个错误。我认为这可能与dll作为常量引用传递有关,但即使摆弄它也没有多大作用。我一直在看这个几个小时,只是似乎不能让它工作。提前感谢您的帮助!
您的列表有两个单元格要管理,即使它是空的。您可以使用
采用不同的设计选择class DoublyLinkedList {
protected:
DListNode *header;
public:
DoublyLinkedList() : header(nullptr) {} // constructor
...
bool isEmpty() const { return header == nullptr; }
void insertLast(int val)
{ if (header == nullptr) {
header = new DListNode(val);
header->next = header->prev = header;
}
else {
header->prev->next = new DListNode(val, header->prev, header);
header->prev = header->prev->next;
}
}
};
然而,根据您的设计选择(开始一个空单元格,结束一个空单元格),您可以将复制构造函数定义为
DoublyLinkedList::DoublyLinkedList(const DoublyLinkedList& dll)
{
// Initialize the list
header.next = &trailer; trailer.prev = &header;
if (this != &dll) {
DListNode* iter = dll.header.next;
while (iter != &dll.trailer) { // no insertion if dll is empty
insertLast(iter->obj);
iter = iter->next;
}
}
}
你应该在每次操作之前和之后绘制你的数据结构,以确保你的算法是如何工作的。
您还可以实现一个不变量(方法bool isValid() const
)来验证单元格之间的链接:cell->next->prev
应该是cell
,除了最后一个空节点;cell->prev->next
应该是cell
,除了第一个空节点。
这个列表看起来与通常的双链表实现有点不同,但它可以工作。
从您所展示的代码来看,两个非指针成员header
和trailer
仅用于跟踪列表的两端,但实际上不是列表的一部分。上面代码片段中的一些东西支持这一点:
- 一个空列表,
header
和trailer
彼此指向对方,没有为这两个节点设置值,也没有在它们之间设置其他节点 -
getFirst()
,根据上面的注释,它应该返回指向第一个节点的指针,实际上返回header
之后的节点,而不是header
本身 - 你有一个
getAfterLast()
函数,根据它的名字判断应该在列表中的最后一个节点之后返回一个标记,并返回trailer
。
如果上面是正确的,header
和trailer
实际上不是列表的一部分,那么你的复制构造函数的实现是错误的。它应该只复制输入列表中的实际值节点,不包括头和尾节点。这意味着您从以getFirst()
开头的节点复制节点值,并在到达getAfterLast()
时停止。
代码中这样写:
if (this != &dll) {
const DListNode* iter = dll.getFirst();
while (iter != dll.getAfterLast()) {
insertLast(iter->obj);
iter = iter->next;
}
}
注意,这也可以很好地处理源列表为空的情况。如果dll
为空,dll.getFirst()
将返回预告片,这也是getAfterLast()
返回的内容。因此,while
循环将不会执行,列表将保持为空。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 对于双向链表复制构造函数,不存在从 "const DListNode" 到 "DListNode *" 的合适转换函数