2017-04-18 107 views
-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 

*/ 

我的代码:

#include <iostream> 
using namespace std; 

class Rational { 
    private: 
     int n; // (fraction numerator) 
     int d; // (fraction denominator). 

    public: 
     Rational() { 
      n = 0; 
      d = 1; 
     } 
     Rational(int num, int denom) { 
      n = num; 
      d = denom; 
     } 

     friend istream& operator >> (istream& in_str, Rational& right); 
     friend ostream& operator << (ostream& out_str, const Rational& right); 
     friend Rational operator+ (const Rational&, const Rational&); 

     //friend istream& operator >> (istream& in_str, Rational& right); 
     //friend ostream& operator <<(ostream& out_str, const Rational& right); 
     //friend Rational operator+(const Rational&, const Rational&); 


}; 




int main() 
{ 
    cout << "Testing declarations" << endl; 
    cout << "Rational x, y(2), z(-5,-6), w(1,-3);" << endl; 
    return 0; 
} 

istream& operator >> (istream& in_str, Rational& right) { 
    cin >> n.right; 
} 
ostream& operator << (ostream& out_str, const Rational& right); { 
    cout << out_str; 
} 
Rational operator+(const Rational&, const Rational&); { 
    cout << Rational; 
} 
+1

*“我无法通过重载操作符实现朋友功能”* - 有什么问题?对不起......我们这里不是魔术师。 :-)。请参阅[如何提问](https://stackoverflow.com/help/how-to-ask) – WhiZTiM

+0

我建议通过一本好的教科书并通过示例进行工作。从长远来看,这对你更有帮助,而不是回答这些具体问题。 –

回答

0

认为它这样....在你的榜样,你是不是真的在重载类的方法,而是你超载运算符>>用于流。 你必须使它成为朋友,让的

istream& operator >> (istream& in_str, Rational& right) 

执行和其他流运营商可以看到你的类的数据成员。它们不是你班级的方法,而是被定义为全局功能。如果他们不是朋友功能,他们就无法看到他们需要使用的私人数据。

https://isocpp.org/wiki/faq/friendshttps://isocpp.org/wiki/faq/operator-overloading

这是极少数时候,它会接近可接受的使用关键字“朋友”之一。在所有情况下,“朋友”一般都不赞成,但是这个和实施工厂模式的时候。

对于一些对比,谷歌“C++重载操作符=”这是一个类方法,因此不需要是朋友。