读书人

宣言为友元确还不能访问private成员

发布时间: 2012-08-15 16:57:17 作者: rapoo

声明为友元,确还不能访问private成员?
我按照书上的写法,建立代码如下:

C/C++ code
#include <iostream>#include <string>using namespace std;class Rational{public:    Rational(int num, int deno);    Rational operator+(Rational rhs);    Rational operator-(Rational rhs);    Rational operator*(Rational rhs);    Rational operator/(Rational rhs);private:    void normalize();    int numerator;    int denominator;    friend ostream& operator <<(ostream& os, Rational f);};Rational::Rational(int num, int deno){    numerator = num;    denominator = deno;    normalize();}//normalize方法实现对有理数的约分简化void Rational::normalize(){    if(denominator < 0){        numerator = -numerator;        denominator = -denominator;    }    int a = abs(numerator);    int b = abs(denominator);    while(b > 0){        int t = (a%b);        a = b;        b = t;    }    numerator /= a;    denominator /= a;}Rational Rational::operator +(Rational rhs){    int a = numerator;    int b = denominator;    int c = rhs.numerator;    int d = rhs.denominator;    int e = a*d + b*c;    int f = b*d;    return Rational(e, f);}Rational Rational::operator -(Rational rhs){    rhs.numerator = -rhs.numerator;    return operator +(rhs);}Rational Rational::operator *(Rational rhs){    int a = numerator;    int b = denominator;    int c = rhs.numerator;    int d = rhs.denominator;    int e = a*c;    int f = b*d;    return Rational(e, f);}Rational Rational::operator /(Rational rhs){    int t = rhs.numerator;    rhs.numerator = rhs.denominator;    rhs.denominator = t;    return operator *(rhs);}int main(){    Rational f1(88,99);    Rational f2(23,78);    cout << f1 << "+" << f2 << "==" << (f1+f2) << "\n";    cout << f1 << "-" << f2 << "==" << (f1-f2) << "\n";    cout << f1 << "*" << f2 << "==" << (f1*f2) << "\n";    cout << f1 << "/" << f2 << "==" << (f1/f2) << "\n";    cout << "press enter or return to continue.\n";    cin.get();    return 0;}ostream& operator <<(ostream& os, Rational f){    os << f.numerator << "/" << f.denominator;    return os;}

问题:1 声明重载函数operator《《为Rational的友元,编译后还是提示无法访问private成员;
2 作为重载操作符《《的函数operator《《,若在紧挨main()之前声明,则编译后不能识别《《的重载
请大侠明示!

[解决办法]
如果你是用VC6,那么就正常了,这是一个经典BUG
http://www.cnblogs.com/xinjun/archive/2010/07/19/1780902.html
[解决办法]
探讨

友元应该声明在public里面吧....

[解决办法]
探讨

我用的VC6.0,不知道有没有用到stl
不太懂,请大侠以代码示之引用:

两个解决办法:
1. 如果楼主不用STL,用VC6也不会出现这个问题滴。
2. 如果用了STL,就不要用VC6了。

[解决办法]
探讨

多谢指点!!!去掉那using namespace std;再依次给cout和ostreaam加上作用域,作用与操作符,编译通过,执行无误!并且,在main之前声明重载函数原型也没问题了!!
大侠所指第二种方法,抛弃vc6,那么下面用什么集成平台呢?引用:

引用:

我用的VC6.0,不知道有没有用到stl
不太懂,请大侠以代码示之引用 3 楼 ……

[解决办法]
探讨

多谢指点!!!去掉那using namespace std;再依次给cout和ostreaam加上作用域,作用与操作符,编译通过,执行无误!并且,在main之前声明重载函数原型也没问题了!!
大侠所指第二种方法,抛弃vc6,那么下面用什么集成平台呢?引用:

引用:

我用的VC6.0,不知道有没有用到stl


不太懂,请大侠以代码示之引用 3 楼 ……

读书人网 >C++

热点推荐