Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用于添加两个双链接列表的重载运算符_C++ - Fatal编程技术网

C++ 用于添加两个双链接列表的重载运算符

C++ 用于添加两个双链接列表的重载运算符,c++,C++,我需要有关重载“+”运算符的帮助,以便将两个双链接列表相加。由于出现“运算符=…”错误,我无法编译程序。我已经重载了“=”运算符,但很难将加法的结果打印到std输出中。我还超载了curr->elem){ 当前=当前->成功; 加法(elem); } else if(elemelem&&elem>(curr->prev)->elem){ pushInside(n); } else if(elemelem){ 当前=当前->当前; 加法(elem); } }否则{ 推回(n); } } void L

我需要有关重载“+”运算符的帮助,以便将两个双链接列表相加。由于出现“运算符=…”错误,我无法编译程序。我已经重载了“=”运算符,但很难将加法的结果打印到std输出中。我还超载了curr->elem){ 当前=当前->成功; 加法(elem); } else if(elemelem&&elem>(curr->prev)->elem){ pushInside(n); } else if(elemelem){ 当前=当前->当前; 加法(elem); } }否则{ 推回(n); } } void LList::pushFront(节点*n){ 水头=n; n->成功=当前; 当前->当前=n; n->prev=0; curr=n; 大小++; } void LList::pushInside(节点*n){ (当前->上一个)->succ=n; n->成功=当前; n->prev=当前->prev; 当前->当前=n; 大小++; } void LList::pushBack(节点*n){ 如果(!头){ 水头=n; }否则{ 尾部->成功=n; n->prev=尾部; } 尾=n; curr=n; 大小++; } 利斯特::~LList(){ 对于(curr=水头;curr;){ 节点*temp=curr->succ; 删除curr; 电流=温度; } } LList&LList::operator=(LList&list){ list.begin(); 如果(此!=&列表){ 对于(curr=水头;curr;){ 节点*temp=curr->succ; 删除curr; 电流=温度; } while(list.curr){ addElem(list.getElem()); list.next(); } } 归还*这个; }
ostream&operator您的代码中有一个明显的错误:

Node* begin()  { curr = head; }
此代码调用未定义的行为,因为您没有返回值。应该是这样的:

Node* begin()  { curr = head; return curr; }
此外,在不更改
LList
参数的函数中,应通过const引用传递
LList

例如:

LList::LList(LList& list);
LList& operator=(LList& list);
friend ostream& operator<<(ostream& os, LList& obj);
LList::LList(LList&list);
list&运算符=(list&列表);
friend ostream&operator在列表类中有一个内置的“current”指针。这是一个严重的设计错误。由于此错误,您无法正确定义函数

这是一个设计错误,因为使用此设计,您无法迭代
const
列表,这意味着,除其他不好的事情外,您无法使用临时列表做任何有用的事情。因此,当您计算
setA+setB
时,您不能将其赋值给任何对象,因为赋值需要迭代,因此您需要一个非常量参数,用于
操作符=
和复制构造函数。但不能将临时引用绑定到非常量引用

即使您绕过复制构造函数和复制分配操作符中的公共接口,直接复制列表而不使用
curr
,您也会遇到与任何必须使用公共接口的用户函数相同的问题。也就是说,
setA+setB
将不能用作函数参数。您需要首先将其分配给某个变量,然后将该变量传递给函数

您也不能接受列表并将其传递到迭代中间的某个函数,并期望继续从您所离开的地方进行迭代,因为迭代列表的任何内容都会更改<代码> Curr> /Cord>指针。< /P> 最好的解决方案是去掉

curr
成员,并利用大部分参数
const-LList&
。虽然这不是onky解决方案,但将当前指针内置到list类中还有许多其他缺点,因此我将不讨论它们

为了迭代列表,您必须提供一个可以在列表上来回移动的单独对象,以及一个可以在常量列表上来回移动的单独变量。这被称为<强>迭代器< /强>,如果您想在C++中做任何事情,则需要阅读这个概念。


在您的情况下,迭代器可以是
节点*
常量节点*
。您只需要提供返回列表中第一个节点的成员函数,该节点已经存在。真正的图书馆也是如此。出于各种原因,它们通常将节点指针包装在单独的迭代器类中;但是对于一个简单的家庭作业来说,这是不必要的(尽管如果你愿意,你可以做);博士请将代码范围缩小到您遇到问题的部分。最好的方法是创建一个并仅显示它。另外,这里没有很多人读波兰语(?),所以请用英语发表评论和输出。很抱歉,第一次在这里发布。将尽快更新它。程序是这样的:你把你的代码放在一个10-100行的源文件中,确保你仍然在得到你想要得到帮助的错误,然后把你的源文件完整地发布出来,不需要任何编辑。不要忘记包含未编辑的错误消息(如果列表太长,也不要忘记包含一些初始行)。如果您发布的内容无法按原样复制和编译以获得与您需要帮助的错误完全相同的错误,那么您是在浪费每个人的时间。addElem方法的作用是什么?@AndrzejSmyk您的代码绝对没有使用
const-LList&
。这可能是你的问题。通过常量引用传递您的
LList
参数。第二,你没有发布标题——当你发布程序时,发布所有内容,包括你包含的标题文件。我还建议将operator+作为好友函数实现。谢谢Paul。问题已解决,向传递给函数的参数添加常量有助于解决问题。谢谢你的帮助@besworland您能提供更多细节说明为什么这样更好吗?@AndrzejSmyk-为什么要为
+
设置
朋友
函数?那么,试试这个,您将看到一个编译错误:
LList list1;list2=7+list1在编译ok时:
LList列表1;list2=list1+7operator+
,以便前者可以工作,或者只接受它
Node* begin()  { curr = head; return curr; }
LList::LList(LList& list);
LList& operator=(LList& list);
friend ostream& operator<<(ostream& os, LList& obj);
LList::LList(const LList& list);
LList& operator=(const LList& list);
friend ostream& operator<<(ostream& os, const LList& obj);
LList list1;
LList list2;
//...
std::cout << list1 + list2;