C++ My first class operator overload, with header
Solution 1
The following compiled in ideone: http://ideone.com/ratVVT
Changes are:
- Implementation of (overload) method must specify the Class name
- Implementation of (overload) method must have the same signature as the declaration (missing const).
- Declaring the variable vector in main
Vector2 vector();
was interpreted as a function declaration, instead of a Vector2 variable.... useVector2 vector;
orVector2 vector=Vector2()
The code copied below.
#include <iostream>
//vectors.h
class Vector2
{
public:
Vector2();
~Vector2();
int counter;
Vector2& operator+=(const Vector2& vec);
};
//vectors.cpp
//#include "vectors.h"
Vector2::Vector2()
{
counter = 0;
}
Vector2::~Vector2()
{
}
Vector2& Vector2::operator+=(const Vector2& vec)// <---- CHANGE
{
int new_n = counter + vec.counter;
counter = new_n;
return *this;//error: this may only be used in a non-static member function.
}
//main.cpp
#include <stdio.h>
//#include "vectors.h"
int main()
{
Vector2 vector; // <---- CHANGE
while(true)
{
vector += vector;
printf("Vector counter: %d\n",vector.counter);
}
}
Solution 2
You are missing the class name in your method definition Vector2::
and the signature does not match because of the first parameter missing a const
.
Vector2& Vector2::operator+=(const Vector2& vec)
MooshBeef
Updated on May 11, 2020Comments
-
MooshBeef almost 4 years
im new to C++, although i do know the general C syntax. I've been trying to create a class with operator overloading. But i can't get it to work. Well partially got it to work.
Working operator overloading in same source:
//test.cpp #include <iostream> class Fraction { int gcd(int a, int b) {return b==0 ? a : gcd(b,a%b); } int n, d; public: Fraction(int n, int d = 1) : n(n/gcd(n,d)), d(d/gcd(n,d)) {} int num() const { return n; } int den() const { return d; } Fraction& operator*=(const Fraction& rhs) { int new_n = n*rhs.n / gcd(n*rhs.n, d*rhs.d); d = d*rhs.d / gcd(n*rhs.n, d*rhs.d); n = new_n; return *this; } }; std::ostream& operator<<(std::ostream& out, const Fraction& f){ return out << f.num() << '/' << f.den() ; } bool operator==(const Fraction& lhs, const Fraction& rhs) { return lhs.num() == rhs.num() && lhs.den() == rhs.den(); } bool operator!=(const Fraction& lhs, const Fraction& rhs) { return !(lhs == rhs); } Fraction operator*(Fraction lhs, const Fraction& rhs) { return lhs *= rhs; } int main() { Fraction f1(3,8), f2(1,2), f3(10,2); std::cout << f1 << '*' << f2 << '=' << f1*f2 << '\n' << f2 << '*' << f3 << '=' << f2*f3 << '\n' << 2 << '*' << f1 << '=' << 2 *f1 << '\n'; }
Output:
3/8*1/2=3/16 1/2*5/1=5/2 2*3/8=3/4
Source: http://en.cppreference.com/w/cpp/language/operators
Now my code, trying to apply the code from above
//vectors.h class Vector2 { public: Vector2(void); ~Vector2(void); int counter; Vector2& operator+=(const Vector2& vec); } //vectors.cpp #include "vectors.h" Vector2::Vector2(void) { counter = 0; } Vector2::~Vector2(void) { } Vector2& operator+=(Vector2& vec)//error: too few parameters { int new_n = counter + vec.counter; counter = new_n; return *this;//error: this may only be used in a non-static member function. } //main.cpp #include <stdio.h> #include "vectors.h" int main(void) { Vector2 vector(); while(true) { vector += vector;//error: expression must be a modifiable value printf("Vector counter: %d\n",vector.counter); } }
What i'm trying to do:
I'm trying to make my own class, and use operator overloading. But the part i can't get to work is defining the class with a header while keeping operator overloading working.
Thanks for reading my question