为什么重载运算符不起作用?
Why the overloaded operator doesn't work?
我正在做一个C++项目,该项目使用存储在LinkedList中的多项式。我想重载重要的运算符,例如 +、-、*、/。当函数返回结果时,我在析构函数方面遇到了一些问题。
Polynomial& Polynomial::operator+(const Polynomial &p){
Polynomial sum = *this;
if (p.list.isEmpty())
return *this;
ListElement *temp = p.list.first;
while (temp){
sum.list.addSorted(temp->data);
temp = temp->next;
}
return sum;
}
这个函数工作得很好,但是return sum;
调用析构函数,我丢失了数据。多项式类中的析构函数调用 list.purge();
释放链表中的动态内存。所有的类及其方法都很好。
总的来说,我有:
Polynomial p1,p2,sum;
p1.input(); //here I input data for first pol
p2.input();
sum=p1+p2; //I overloaded operator=, it works fine
我必须做什么来"停止"析构函数?我想在屏幕上输出多项式sum
。谢谢!
最好这样重
载运算符+
:
Polynomial operator+(const Polynomial& p1, const Polynomial &p2){
if (p1.list.isEmpty())
return p2;
else if (p2.list.isEmpty())
return p1;
Polynomial sum = p1;
ListElement *temp = p2.list.first;
while (temp){
sum.list.addSorted(temp->data);
temp = temp->next;
}
return sum;
}
1.让它有两个参数,并使其friend
类Polynomial
2. 退回object
而不是reference
你不应该返回对局部变量的引用!
Polynomial sum = *this;
...
return sum;
从返回类型中删除&
。 sum
存在于堆栈上(也称为自动存储)。当其包含范围退出时,它将被销毁 - 调用该实例的析构函数。不应返回对它的引用;这就像返回对幽灵的引用。
如果您按值返回,则将返回总和的副本,您将没问题。
不要返回对局部变量的引用。在函数作用域内创建的对象在该作用域内生存和死亡。
但是,您可以创建引用对象的变量,并且该变量的生存期现在与它所引用的对象的生存期相同。
喜欢这个:
Polynomial& Polynomial::operator+(const Polynomial &p){
Polynomial &sum = *this;
if (p.list.isEmpty())
return sum;
ListElement *temp = p.list.first;
while (temp){
sum.list.addSorted(temp->data);
temp = temp->next;
}
return sum;
}
相关文章:
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 重载运算符 (<<) cout 在 c ++ 中不起作用,当我互相减去两个矩阵时不起作用
- std::string == 运算符在代码中不起作用
- C++11+=当RHS有多个字符串或字符时,运算符不起作用
- 运算符的全局过载<<不起作用,为什么?
- 自定义类型转换运算符在转发引用上调用时不起作用(当对象按值传递时有效)
- 为什么重载运算符>在参数声明 const 时不起作用?
- 重载"+="运算符:c+=a_times_b 有效,但 c+=a*b 不起作用?
- C++宏"##"在"->"运算符后不起作用
- 为什么“运算符<<(cout,double)”不起作用
- 相等运算符优先级不起作用
- C++ - 父级中的 CRTP 分配运算符不起作用
- 隐式用户定义的转换不起作用,因为在编译C 时无法识别运算符和转换构造函数
- 赋值不起作用,但带有取消引用运算符的地址起作用?
- C++ 运算符重载 += 有效,但<<不起作用
- 需要使用 Book* 头变量重载运算符,但不起作用
- C++ 运算符删除重载对派生类不起作用
- 为什么重载运算符上的异常说明符'<<'不适用于任何 std::ostream 对象,但对库中定义的运算符不起作用?
- 运算符重载如何工作,为什么在我的情况下不起作用?
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符