Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ My first class operator overload, with header

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

like image 803
MooshBeef Avatar asked Jan 18 '26 10:01

MooshBeef


1 Answers

The following compiled in ideone: http://ideone.com/ratVVT

Changes are:

  1. Implementation of (overload) method must specify the Class name
  2. Implementation of (overload) method must have the same signature as the declaration (missing const).
  3. Declaring the variable vector in main Vector2 vector(); was interpreted as a function declaration, instead of a Vector2 variable.... use Vector2 vector; or Vector2 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);
    }
}
like image 188
jsantander Avatar answered Jan 20 '26 00:01

jsantander



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!