C++ My first class operator overload, with header

21,185

Solution 1

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

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)
Share:
21,185
MooshBeef
Author by

MooshBeef

Updated on May 11, 2020

Comments

  • MooshBeef
    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