VS2013 C ++错误C2679:二进制'>>' :找不到哪个操作符采用类型'分数'的右手操作数。 (或者没有可接受的转换)

时间:2014-11-30 01:01:19

标签: c++ visual-c++

大家好我是stackoverflow的新手,所以如果我犯了一些错误,请原谅我。我被要求编写一个程序,从由分数组成的点开发矩形和圆形。我有一个为我的Fraction定义的类,我已经重载了二进制运算符友元函数,用于插入和提取“<<” &安培; “>>” 中对于我的分数。虽然我在我的Point类中重载了运算符但是我得到了这个错误,我无法弄清楚为什么我得到它,即使我在我的Fraction类中重载了运算符。我知道问题必须在我的Fraction类中定义友元函数的语法中。我迷路了,任何帮助都将受到赞赏。我不被允许使用全局库。谢谢您的帮助。 乔

point.h

#ifndef POINT_H
#define POINT_H

#include <iostream>
#include "fraction.h"
using namespace std;

class Point {
public:
    Point();
    Point(const Point&);
    Point(const Fraction&);
    Point(Fraction&, Fraction&);
    ~Point();
    Fraction getX(void) const;
    void setX(const Fraction&);
    Fraction getY(void) const;
    void setY(const Fraction&);

    void moveBy(Fraction delX, Fraction delY);
    void moveBy(int iOld);
    void flipByX(void);
    void flipByy(void);
    void print(void);
    void operator=(const Point&);
    Point operator+(const Point&);
    Point operator-(const Point&);
    friend ostream& operator<<(ostream&, const Point&);
    friend istream& operator>>(istream&, Point&);

private:
    Fraction x;
    Fraction y;
};

#endif

//Descritpion:  Point.cpp
#include <iostream>
#include "point.h"
#include "fraction.h"
#include "rectangle.h"
#include "utilities.h"
using namespace std;
Point::Point() : x(1, 2) , y(1, 1) {

}

Point::Point(const Point& po1) : x(po1.getX()), y(po1.getY()) {

}

Point::Point(const Fraction& fr1) : x(fr1), y(1,1) {

}

Point::Point(Fraction& fr1, Fraction& fr2) : x(fr1), y(fr2) {

}

Point::~Point() {

}

Fraction Point::getX() const {
    return x;
}

void Point::setX(const Fraction& fr1) {
    x = fr1;
}

Fraction Point::getY() const {
    return y;
}

void Point::setY(const Fraction& fr2) {
    y = fr2;
}

void Point::moveBy(Fraction delX, Fraction delY) {
    x = x + delX;
    y = y + delY;
} 

void Point::moveBy(int iOld) {
    Fraction frac(iOld);
    x = x + frac;
    y = y + frac;
}

void Point::flipByX() {
    x.setNum(-x.getNum());
}

void Point::flipByy() {
    y.setNum(-y.getNum());
}

void Point::operator=(const Point& arg) {
    x = arg.x;
    y = arg.y;
    return;
}

Point Point::operator+(const Point& arg) {
    return Point(x + arg.x, y + arg.y);
}

Point Point::operator-(const Point& arg) {
    return Point(this->getX() - arg.getX(), this->getY() - arg.getY());
}

ostream& operator<<(ostream& out, const Point& po) {
    out << " " << po.getX() << " : " << po.getY() << " ";
    return out;
}


istream& operator>>(istream& in, Point& po) {
    cout << "\n    X-Coordinate : ";
    in >> po.x;  //Error C2679
    cout << "\n    Y-Coordinate : ";
    in >> po.y;  //Error C2679
    return in;
}

和Fraction.h

#ifndef FRACTION_H
#define FRACTION_H

#include <iostream>
using namespace std;

class Fraction {
public:
    Fraction();
    Fraction(const Fraction&);
    Fraction(int);
    Fraction(int, int);
    ~Fraction(){

    }
    void print(void) const;
    int getNum(void) const;
    void setNum(int);
    int getDenom(void) const;
    void setDenom(int);

    void operator=(const Fraction&);
    Fraction operator+(const Fraction&);
    Fraction operator-(const Fraction&);
    Fraction operator*(const Fraction&);
    Fraction operator/(const Fraction&);
    friend ostream& operator<<(ostream&, const Fraction&);
    friend istream& operator>>(istream&, Fraction&);
private:
    int num;
    int denom;
};
#endif

Fraction.cpp

#include <iostream>
#include "point.h"
#include "fraction.h"
#include "rectangle.h"
#include "utilities.h"
using namespace std;

Fraction::Fraction() : num(0), denom(0) {
}

Fraction::Fraction(const Fraction& arg) {
    num = arg.num;
    denom = arg.denom;
}

Fraction::Fraction(int arg) {
    num = arg;
    denom = 1;
}

Fraction::Fraction(int n, int d) {
    int temp;
    int a = n;
    int b = d;

    while (b) {
        temp = b;
        b = a % b;
        a = temp;
    }
    a = (a < 0) ? -a : a;
    //num = (d < 0) ? -(n / a) : n / a;
    num = n / a;
    denom = (d < 0) ? -(d / a) : d / a;

}


void Fraction::print() const {
    cout << num << "/" << denom << endl;
}

int Fraction::getNum() const {
    return num;
}

void Fraction::setNum(int n) {
    num = n;
}

int Fraction::getDenom() const {
    return denom;
}

void Fraction::setDenom(int n) {
    denom = n;
}


void Fraction::operator=(const Fraction& arg) {
    num = arg.getNum();
    denom = arg.getDenom();
    return;
}

Fraction Fraction::operator+(const Fraction& arg) {
    return Fraction(num * arg.denom + arg.num * denom,
        denom * arg.denom);
}

Fraction Fraction::operator-(const Fraction& arg) {
    return Fraction(num * arg.denom - arg.num * denom,
        denom * arg.denom);
}

Fraction Fraction::operator*(const Fraction& arg) {
    if (this->getNum() == 0 || arg.getNum() == 0) {
        return Fraction(0, 1);
    } else {
        return Fraction(num * arg.num, denom * arg.denom);
    }
}

Fraction Fraction::operator/(const Fraction& arg) {
    if (this->getNum() == 0 || arg.getNum() == 0) {
        return Fraction(0, 1);
    } else {
        return Fraction(num * arg.denom, denom * arg.num);
    }
}

ostream& operator<<(ostream& out, const Fraction& rOp) {
    return out << " " << rOp.getNum() << " / " << rOp.getDenom() << " ";
}

istream& operator>>(istream& in, Fraction& arg) {
    int a, b;
    cout << "\n\tEnter a numerator : ";
    in >> a;
    cout << "\n\tEntere a denominator : ";
    in >> b;
    arg = Fraction(a, b);
    return in;
}

0 个答案:

没有答案