【问题标题】:C++ My first class operator overload, with headerC ++我的第一类运算符重载,带有标题
【发布时间】:2014-06-28 06:38:09
【问题描述】:

我是 C++ 新手,虽然我知道一般的 C 语法。我一直在尝试创建一个具有运算符重载的类。但我无法让它工作。好吧,它已经部分工作了。

在同一源中重载工作运算符:

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

输出:

3/8*1/2=3/16
1/2*5/1=5/2
2*3/8=3/4

来源:http://en.cppreference.com/w/cpp/language/operators

现在我的代码,尝试从上面应用代码

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

我想做什么:

我正在尝试创建自己的类,并使用运算符重载。但我无法开始工作的部分是使用标题定义类,同时保持运算符重载工作。

感谢您阅读我的问题

【问题讨论】:

    标签: c++ class operator-overloading


    【解决方案1】:

    ideone编译如下:http://ideone.com/ratVVT

    变化是:

    1. (重载)方法的实现必须指定类名
    2. (重载)方法的实现必须与声明具有相同的签名(缺少 const)。
    3. 在 main Vector2 vector(); 中声明变量向量被解释为函数声明,而不是 Vector2 变量....使用 Vector2 vector;Vector2 vector=Vector2()

    下面复制的代码。

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

    【讨论】:

    • 请从参数列表中删除void 。它只是丑陋,它不是 C++...
    • @Massa 按照您的要求删除了 (void)。
    【解决方案2】:

    您的方法定义中缺少类名Vector2::,并且签名不匹配,因为第一个参数缺少const

    Vector2& Vector2::operator+=(const Vector2& vec)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 2015-10-22
      • 2013-12-08
      相关资源
      最近更新 更多