C++ 运算符+;的过载有什么问题;?

C++ 运算符+;的过载有什么问题;?,c++,reference,operator-overloading,C++,Reference,Operator Overloading,我有一个名为List的类,它实现了一个链表 我正在尝试重载链表类的“+”运算符,以便可以执行此类操作: List l1; /* add a and b to l1 */ List l2; /* add c and d to l2 */ List l3 = l1 + l2; /* l3 contains a, b, c, d and l1 and l2 are unchanged */ 我已经实现了操作符+=这样,它似乎工作得很好 List& List::operator+=(List&

我有一个名为List的类,它实现了一个链表

我正在尝试重载链表类的“+”运算符,以便可以执行此类操作:

List l1;
/* add a and b to l1 */
List l2;
/* add c and d to l2 */
List l3 = l1 + l2;
/* l3 contains a, b, c, d and l1 and l2 are unchanged */
我已经实现了操作符+=这样,它似乎工作得很好

List& List::operator+=(List& otherList) {
  Node* currNode = otherList.getHead();
  while (currNode) {
    this->add(currNode->getData());
    currNode = currNode->getNext();
  }
  return *this;
}
下面是我实现operator+的尝试,但它似乎不起作用

List List::operator+(List& otherList) {
  List* l = new List();
  l += *this;
  l += otherList;
  return *l;
}
当我这样尝试时:

List l1;
List l2;
List l3;
l3 = l1 + l2;
我得到这个错误:

Main.cc:25:13: error: no match for ‘operator=’ in ‘l3 = List::operator+(List&)((* & l2))’
知道我做错了什么吗

更新:我还有一个operator=看起来像这样,似乎工作正常

List& List::operator=(List& otherList);

您的
操作员+
没有故障;很明显,您缺少一个副本分配操作员


此外,停止动态分配所有内容;你在像一个seive一样泄漏。

你的
操作员+
没有错;很明显,您缺少一个副本分配操作员


此外,停止动态分配所有内容;您正在像seive一样泄漏。

如果
操作符+=
正确,则只需执行此操作(在类定义之外):


正如其他人所说,由于要复制对象,必须有一个复制赋值操作符、一个复制构造函数和一个析构函数。(除非默认值有效,否则我们无法确定,而不查看
List
)。

如果
operator+=
正确,则只需执行此操作(超出类定义):


正如其他人所说,由于要复制对象,必须有一个复制赋值操作符、一个复制构造函数和一个析构函数。(除非默认的有效,如果没有看到
列表的定义,我们就无法确定这一点)。

看起来我找到了一个解决方案,可以满足。。。这对我很有用:

List& List::operator+(List& otherList) {
  List* l = new List();
  *l += *this;
  *l += otherList;
  return *l;
}

谢谢大家的帮助。

看来我找到了一个解决方案,可以满足。。。这对我很有用:

List& List::operator+(List& otherList) {
  List* l = new List();
  *l += *this;
  *l += otherList;
  return *l;
}

谢谢大家的帮助。

您有复印作业操作员吗?先生,请远离此代码,休息几个小时;)此外,您的
operator+
实现也可以大大改进。特别是,用基于堆栈的对象替换动态分配的内存。@0x499602D2“复制分配运算符”是否表示运算符=?如果是这样,我有一个“List&List::operator=(List&otherList);”的实现和工作。谢谢@马丁尼。不错的建议,但我想现在就开始工作——任何你认为我遗漏的愚蠢的具体内容?你有副本分配操作员吗?先生,远离此代码,休息几个小时;)此外,您的
operator+
实现也可以大大改进。特别是,用基于堆栈的对象替换动态分配的内存。@0x499602D2“复制分配运算符”是否表示运算符=?如果是这样,我有一个“List&List::operator=(List&otherList);”的实现和工作。谢谢@马丁尼。这是个不错的建议,但我现在想让它工作起来——任何你认为我遗漏的愚蠢的具体内容?但是如果我
返回x+=y
,我不是在更改“x”的内容吗?我的理解是(比如,
intx=y+z;
返回一个新的int
x
,而不改变
y
z
)操作符+必须创建一个包含x和y元素的新列表。我说的对吗?不,你是在创建一个局部变量并修改它,然后返回它。参数
List x
表示
x
是传入参数的副本。但是如果我
返回x+=y
,我是否没有更改“x”的内容?我的理解是(比如,
intx=y+z;
返回一个新的int
x
,而不改变
y
z
)操作符+必须创建一个包含x和y元素的新列表。我说的对吗?不,你是在创建一个局部变量并修改它,然后返回它。参数
List x
表示
x
是传入参数的副本。
operator+()
实际上不应返回引用。这对您有什么帮助?
operator+()
实际上不应该返回引用。这对你有什么帮助?