如何修复重载操作数+

How to fix overloading operands +?

本文关键字:操作数 重载 何修复      更新时间:2023-10-16

我有过载opearator+的问题。

这是我的代码:

class Odcinek : public Figura
{
public:
Odcinek(int ile,string imie,char znak): Figura(ile,imie,znak){}
friend Odcinek& operator+(int liczba);
virtual void wypisz() const;
};
Odcinek& operator+(int liczba);
{
Odcinek Od;
Od.ile = Od.ile+liczba;
Od.imie = imie;
Od.znak = znak;
return Od;
}

我希望这个工作:

Odcinek F3(5,"Odcinek drugi",'*');
F3+3;
|===编译:在Figura中调试(编译器:GNU GCC编译器)===|include\Figura.h|29|错误:"Odcinek&operator+(int)"必须具有类或枚举类型的参数|C: \Users\mkkar\Desktop\Programowanie obiektowe~kolokwium\Figura\main.cpp||在函数'int main()'中:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|错误:与"operator+"不匹配(操作数类型为"Odcinek"answers"int")|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bitss\stl_iterator.h|341|注意:候选者:模板std::reverse_iterator std::operator+(typename std::inverse_iterator::difference_type,const std::reverse_iterator&)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_iterator.h|341|注意:模板参数推导/替换失败:|include\Figura.h|29|错误:"Odcinek&operator+(int)"必须具有类或枚举类型的参数|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\src\Figura.cpp|67|错误:"Odcinek&operator+(int)"必须具有类或枚举类型的参数|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\src\Figura.cpp|68|错误:在"{"标记之前应为不合格id|C: \Users\mkkar\Desktop\Programowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:类型"const-std::reverse_iterator"answers"int"不匹配|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bitss\stl_iterator.h|1200|注意:候选者:模板std::move_iterator std::operator+(typename std::move_iterator::difference_type,const std::move_iterator&)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_iterator.h|1200|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:类型"const-std::move_iterator"answers"int"不匹配|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4929|注意:候选者:模板std::__cxx11::basic_stringstd::运算符+|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4929|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:"Odcinek"不是从"const std::__cxx11::basic_string"派生的|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.tcc|1147|注意:候选者:模板std::__cxx11::basic_string std::operator+(const_CharT*,const std::__ cxx11:;basic_string&)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.tcc|1147|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:类型"const_CharT*"answers"Odcinek"不匹配|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.tcc|1163|注意:候选者:模板std::__cxx11::basic_string std::operator+(_CharT,const std::__ cxx11:;basic_string&)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.tcc|1163|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:类型'const-std::__cxx11::basic_string'和'int'不匹配|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4966|注意:候选者:模板std::__cxx11::basic_string std::运算符+(const std::__ cxx11:;basic_string&,const_CharT*)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4966|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:"Odcinek"不是从"const std::__cxx11::basic_string"派生的|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4982|注意:候选者:模板std::__cxx11::basic_string std::运算符+(const std::__ cxx11:;basic_string&,_CharT)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4982|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:"Odcinek"不是从"const std::__cxx11::basic_string"派生的|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4994|注意:候选者:模板std::__cxx11::basic_stringstd::运算符+|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4994|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Programowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:"Odcinek"不是从"std::__cxx11::basic_string"派生的|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5000|注意:候选者:模板std::__cxx11::basic_stringstd::运算符+|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5000|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:"Odcinek"不是从"const std::__cxx11::basic_string"派生的|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5006|注意:候选者:模板std::__cxx11::basic_stringstd::运算符+|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5006|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Programowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:"Odcinek"不是从"std::__cxx11::basic_string"派生的|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5018|注意:候选者:模板std::__cxx11::basic_string std::operator+(const_CharT*,std::___cxx11::basic_string&&)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5018|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Progowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:类型"const_CharT*"answers"Odcinek"不匹配|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5024|注意:候选者:模板std::__cxx11::basic_string std::operator+(_CharT,std::__ cxx11:;basic_string&&)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5024|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Programowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:类型"std::__cxx11::basic_string"answers"int"不匹配|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5030|注意:候选者:模板std::__cxx11::basic_string std::运算符+(std::__ cxx11:;basic_string&&,const_CharT*)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5030|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Programowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:"Odcinek"不是从"std::__cxx11::basic_string"派生的|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5036|注意:候选者:模板std::__cxx11::basic_string std::operator+(std::__ cxx11:;basic_string&&,_CharT)|c: \mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5036|注意:模板参数推导/替换失败:|C: \Users\mkkar\Desktop\Programowanie obiektowe~kolokwium\Figura\main.cpp|15|注意:"Odcinek"不是从"std::__cxx11::basic_string"派生的|||===生成失败:5个错误,0个警告(0分钟,1秒)===|

代码中的许多问题

1) 操作员定义中有一个额外的分号

Odcinek& operator+(int liczba);
^

2) 您的operator+只有一个参数,但您的代码使用了两个参数。我认为解决这个问题的办法是不要把它变成朋友函数。或者,你可以把它当作朋友,但添加第二个论点。然而,这将需要对已经编写的代码进行更多的更改。

3)operator+的实现似乎使用了一个未初始化的值

Odcinek Od;
Od.ile = Od.ile+liczba;

我猜应该是

Odcinek Od;
Od.ile = ile+liczba;

4) 最后也是最严重的一点是,您的operator+返回一个对已不存在的对象的引用

Odcinek& operator+(int liczba)
{
Odcinek Od; // Od created here
Od.ile = ile+liczba;
Od.imie = imie;
Od.znak = znak;
return Od;
} // Od destroyed here

但是您返回了对已销毁的Od对象的引用。答案是返回一个值,而不是引用。按值返回时,会生成Od对象的副本并返回该副本,因此Od已被销毁并不重要。

这里有一个更好的版本,它是否有效取决于您没有向我们展示的代码,但请尝试一下。

class Odcinek : public Figura
{
public:
Odcinek(int ile,string imie,char znak): Figura(ile,imie,znak){}
Odcinek operator+(int liczba) const;
virtual void wypisz() const;
};
Odcinek Odcinek::operator+(int liczba) const
{
Odcinek Od;
Od.ile = ile+liczba;
Od.imie = imie;
Od.znak = znak;
return Od;
}