-2

I have problem with overloading opearator +.

Here is my code:

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;
}

I want this to work:

Odcinek F3(5,"Odcinek drugi",'*');

F3+3;
||=== Build: Debug in Figura (compiler: GNU GCC Compiler) ===|
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||In function 'int main()':|
C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|error: no match for 'operator+' (operand types are 'Odcinek' and 'int')|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_iterator.h|341|note: candidate: template std::reverse_iterator std::operator+(typename std::reverse_iterator::difference_type, const std::reverse_iterator&)|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_iterator.h|341|note:   template argument deduction/substitution failed:|
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: expected unqualified-id before '{' token|
C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|note:   mismatched types 'const std::reverse_iterator' and 'int'|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_iterator.h|1200|note: candidate: template 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|note:   template argument deduction/substitution failed:|
C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|note:   mismatched types 'const std::move_iterator' and 'int'|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4929|note: candidate: template std::__cxx11::basic_string std::operator+(const std::__cxx11::basic_string&, const std::__cxx11::basic_string&)|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4929|note:   template argument deduction/substitution failed:|
C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|note:   'Odcinek' is not derived from 'const std::__cxx11::basic_string'|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.tcc|1147|note: candidate: template 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|note:   template argument deduction/substitution failed:|
C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|note:   mismatched types 'const _CharT*' and 'Odcinek'|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.tcc|1163|note: candidate: template 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|note:   template argument deduction/substitution failed:|
C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|note:   mismatched types 'const std::__cxx11::basic_string' and 'int'|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4966|note: candidate: template 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|note:   template argument deduction/substitution failed:|
C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|note:   'Odcinek' is not derived from 'const std::__cxx11::basic_string'|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4982|note: candidate: template 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|note:   template argument deduction/substitution failed:|
C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|note:   'Odcinek' is not derived from 'const std::__cxx11::basic_string'|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4994|note: candidate: template std::__cxx11::basic_string std::operator+(std::__cxx11::basic_string&&, const std::__cxx11::basic_string&)|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|4994|note:   template argument deduction/substitution failed:|
C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|note:   'Odcinek' is not derived from 'std::__cxx11::basic_string'|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5000|note: candidate: template 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|note:   template argument deduction/substitution failed:|
C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|note:   'Odcinek' is not derived from 'const std::__cxx11::basic_string'|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5006|note: candidate: template 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|5006|note:   template argument deduction/substitution failed:|
C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|note:   'Odcinek' is not derived from 'std::__cxx11::basic_string'|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5018|note: candidate: template 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|note:   template argument deduction/substitution failed:|
C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|note:   mismatched types 'const _CharT*' and 'Odcinek'|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5024|note: candidate: template 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|note:   template argument deduction/substitution failed:|
C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|note:   mismatched types 'std::__cxx11::basic_string' and 'int'|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5030|note: candidate: template 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|note:   template argument deduction/substitution failed:|
C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|note:   'Odcinek' is not derived from 'std::__cxx11::basic_string'|
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_string.h|5036|note: candidate: template 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|note:   template argument deduction/substitution failed:|
C:\Users\mkkar\Desktop\Programowanie obiektowe ~kolokwium\Figura\main.cpp|15|note:   'Odcinek' is not derived from 'std::__cxx11::basic_string'|
||=== Build failed: 5 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|
user4581301
  • 33,082
  • 7
  • 33
  • 54
M K
  • 39
  • 7
  • You return a reference to an object that no longer exists. Your operator should return `Odcinek` by value. – Yksisarvinen Jan 11 '19 at 22:38
  • What does it mean? Could you please explain it to me? – M K Jan 11 '19 at 22:40
  • 1
    Well, first, the compiler errors come from fact, that your operator lacks an argument. `operator +` should have 2 operands, unless it's a member of a class (then first operand is that class always). You operator is not a member of your class, so it requires 2 arguments. – Yksisarvinen Jan 11 '19 at 22:44
  • And if you fix compilation, you're likely going to hit the bug I mentioned. Since this is for kolokwium from OOP, I assume you know what a reference is? When you return that reference from your function, the `Odcinek` is already gone. What happens if you try to use that object? Nobody knows, it's Undefined Behaviour. – Yksisarvinen Jan 11 '19 at 22:49
  • Thank you so much for your help :) – M K Jan 11 '19 at 23:15

1 Answers1

0

Many problems in your code

1) You have an extra semi-colon in your operator definition

Odcinek& operator+(int liczba);
                              ^

2) Your operator+ only has one argument, but your code uses two. I think the solution to this is to not make it a friend function. Alternatively you could leave it as a friend but add the second argument. This would require more changes to the already written code however.

3) Your implementation of operator+ seems to use an uninitialised value

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

I'm guessing that should be

    Odcinek Od;
    Od.ile = ile+liczba;

4) Finally and most seriously your operator+ returns a reference to an object that no longer exists

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

But you return a reference to the already destroyed Od object. The answer is to return a value, not a reference. When you return by value a copy of the Od object is made and the copy is returned, so it doesn't matter that Od has been destroyed.

Here a better version, whether it works or not depends upon code you haven't shown us, but give it a go.

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;
}
john
  • 85,011
  • 4
  • 57
  • 81