【问题标题】:How to fix overloading operands +? [duplicate]如何修复重载操作数+? [复制]
【发布时间】:2019-01-11 22:35:46
【问题描述】:

我遇到了重载运算符 + 的问题。

这是我的代码:

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|error: 'Odcinek& operator+(int)' must have an argument of class or enumerated type| C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp||在函数'int main()'中:| C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|错误:'operator+' 不匹配(操作数类型为 'Odcinek' 和 'int')| c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_iterator.h|341|注:候选:模板std::reverse_iterator std::operator+(typename std::reverse_iterator::difference_type,常量 std::reverse_iterator&)| c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_iterator.h|341|注意:模板参数推导/替换失败:| include\Figura.h|29|error: 'Odcinek& operator+(int)' must have an argument of class or enumerated type| C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\src\Figura.cpp|67|error: 'Odcinek& operator+(int)' must have an argument of class or enumerated type| C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\src\Figura.cpp|68|error: '{' token| 之前的预期不合格 ID C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|注意:不匹配的类型 'const std::reverse_iterator' 和 'int'| c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_iterator.h|1200|注:候选:模板std::move_iterator std::operator+(typename std::move_iterator::difference_type,常量 std::move_iterator&)| c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_iterator.h|1200|注:模板参数推导/替换失败:| C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|注意:不匹配的类型 'const std::move_iterator' 和 'int'| c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4929|注:候选:模板std::__cxx11::basic_string std::operator+(const std::__cxx11: :basic_string&, 常量 std::__cxx11::basic_string&)| c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4929|注意:模板参数推导/替换失败:| C:\Users\mkkar\Desktop\Programowanie 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\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|注意:不匹配的类型 'const _CharT*' 和 '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\Programowanie 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::operator+(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\Programowanie 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::operator+(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\Programowanie 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_string std::operator+(std::__cxx11:: basic_string&&, 常量 std::__cxx11::basic_string&)| 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_string std::operator+(const std::__cxx11: :basic_string&, std::__cxx11::basic_string&&)| c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5000|注:模板参数推导/替换失败:| C:\Users\mkkar\Desktop\Programowanie 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_string std::operator+(std::__cxx11::基本字符串&&,std::__cxx11::基本字符串&&)| 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\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|注意:不匹配的类型 'const _CharT*' 和 '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 ::基本字符串&&)| 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' 和 'int'| c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5030|注:候选:模板std::__cxx11::basic_string std::operator+(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::基本字符串&&, _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 秒)===|

【问题讨论】:

  • 您返回一个对不再存在的对象的引用。您的操作员应按值返回 Odcinek
  • 什么意思?你能给我解释一下吗?
  • 嗯,首先,编译器错误来自事实,即您的运算符缺少参数。 operator + 应该有 2 个操作数,除非它是某个类的成员(那么第一个操作数始终是该类)。您的操作员不是您的类的成员,因此它需要 2 个参数。
  • 如果你修复编译,你很可能会遇到我提到的错误。由于这是来自 OOP 的 kolokwium,我假设您知道参考是什么?当您从函数返回该引用时,Odcinek 已经消失了。如果您尝试使用该对象会发生什么?没有人知道,这是未定义的行为。
  • 非常感谢您的帮助:)

标签: c++ class operator-overloading


【解决方案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;
}

【讨论】:

  • 非常感谢您的时间和帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多