大家好我是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;
}