我在使用重载运算符实现友元函数时遇到问题。我对使用这些函数需要什么没有充分的理解。如果有人能给我一些如何进行的指导。请提前谢谢你。 说明:
O(1)
我的代码:
This class implements rational number of the type 2/3.
class Rational;
private data: int n, (fraction numerator)
int d (fraction denominator).
// make sure that d is always positive.
// optional: always simplify the number so that n and d don't have a common factor
public interface:
constructors:
two int args, to allow setting rational to any legal value
default numerator to be 0, default denominator to be 1
friend istream& operator >>(istream& in_str, Rational& right)
friend ostream& operator <<(ostream& out_str, cnst Rational& right)
overload + - * / < <= > >= ==
friend Rational operator+(const Rational&, const Rational&);
....
*/
/*
A possible test and output is given below.
int main()
{
cout << "Testing declarations" << endl;
cout << "Rational x, y(2), z(-5,-6), w(1,-3);" << endl;
Rational x, y(2), z(-5, -6), w(1, -3);
cout << "x = " << x << ", y = " << y << ", z = " << z
<< ", w = " << w << endl << endl;
cout << "Testing the constructor and normalization routines: " << endl;
y = Rational(-1, -4);
cout << "y =Rational(-1, -4) outputs as " << y << endl;
y = Rational(-1, 4);
cout << "y =Rational(-1, 4)outputs as " << y << endl;
y = Rational(1, -4);
cout << "y = Rational(128, -48) outputs as " << y << endl;
Rational a(1, 1);
cout << "Rational a(1,1); a outputs as: " << a << endl;
Rational ww = y*a;
cout << y << " * " << a << " = " << ww << endl << endl;
cout << "Testing >> overloading: \nEnter "
<< "a fraction in the format "
<< "integer_numerator/integer_denominator"
<< endl;
cin >> x;
cout << "You entered the equivalent of: " << x << endl;
cout << z << " - (" << w << ") = " << z - w << endl << endl;
w = Rational(-7, 3);
z = Rational(-3, 5);
cout << "Testing arithmetic and relational "
<< " operator overloading" << endl << endl;
cout << w << " * " << z << " = " << w * z << endl;
cout << w << " + " << z << " = " << w + z << endl;
cout << w << " - " << z << " = " << w - z << endl;
cout << w << " / " << z << " = " << w / z << endl;
cout << w << " < " << z << " : " << (w < z) << endl;
cout << w << " <= " << z << " : " << (w <= z) << endl;
cout << w << " <= " << w << " : " << (w <= w) << endl;
cout << w << " > " << z << " : " << (w > z) << endl;
cout << w << " > " << w << " : " << (w > w) << endl;
cout << w << " >= " << z << " : " << (w >= z) << endl;
return 0;
}
== == == == == == == == ==
TestingTesting declarations
Rational x, y(2), z(-5, -6), w(1, -3);
x = 0 / 1, y = 2 / 1, z = 5 / 6, w = -1 / 3
Testing the constructor and normalization routines :
y = Rational(-1, -4) outputs as 1 / 4
y = Rational(-1, 4)outputs as - 1 / 4
y = Rational(128, -48) outputs as - 1 / 4
Rational a(1, 1); a outputs as : 1 / 1
- 1 / 4 * 1 / 1 = -1 / 4
Testing >> overloading :
Enter a fraction in the format integer_numerator / integer_denominator
2 / -3
You entered the equivalent of : -2 / 3
5 / 6 - (-1 / 3) = 21 / 18
Testing arithmetic and relational operator overloading
- 7 / 3 * -3 / 5 = 21 / 15
- 7 / 3 + -3 / 5 = -44 / 15
- 7 / 3 - -3 / 5 = -26 / 15
- 7 / 3 / -3 / 5 = 35 / 9
- 7 / 3 < -3 / 5 : 1
- 7 / 3 <= -3 / 5 : 1
- 7 / 3 <= -7 / 3 : 1
- 7 / 3 > -3 / 5 : 0
- 7 / 3 > -7 / 3 : 0
- 7 / 3 >= -3 / 5 : 0
*/
答案 0 :(得分:0)
以这种方式思考....在您的示例中,您并没有真正重载类中的方法,而是重载运算符&gt;&gt;对于溪流。 你必须把它变成朋友才能实现
istream& operator >> (istream& in_str, Rational& right)
,其他流操作员可以查看您班级的成员数据。它们不是您的类的方法,而是定义为全局函数。如果他们不是朋友功能,他们就无法看到他们需要使用的私人数据。
参见https://isocpp.org/wiki/faq/friends 和https://isocpp.org/wiki/faq/operator-overloading
这是使用关键字“朋友”几乎可以接受的次数之一。 “朋友”在所有情况下都是不受欢迎的,但是在实施工厂模式的时候。
对于某些对比,google“C ++重载operator =”这是一种类方法,因此不需要成为朋友。