VC6.0中重载操作符函数无法访问类的私有成员[转]

 今天写程序时遇到的问题,谭c++说是去掉using namesapce std;改#include<iostream> 为#include<iostream.h>,这个方法也是可以的,但就是要是你用到其他的stl中的东西,你就必须要加std::,或许还会有其他的问题,反正就是很麻烦。然后到网上去搜了下这个问题的解决方案,还是有好几种方法的,作为参考:

经过测试发现第一种方法是不行的,第二种方法是可以的。搞了好几个小时,55555555

-----------------------------------------------------------------------------------------------------------------------------------

 

在 C++ 中,操作符(运算符)可以被重载以改写其实际操作。
同时我们可以定义一个函数为类的朋友函数(friend function)以便使得这个函数能够访问类的私有成员,
这个定义通常在头文件中完成。

在Visual C++中定义一般的函数为朋友函数通常是没有问题的。
然而对某些重载操作符的函数,
即使我们将它们定义为类的朋友函数,VC的编译器仍然会显示出错信息,
认为这些朋友函数无权访问类的私有成员。
我认为这应该是VC6.0的bug。

以下代码就是个例子:

// 头文件 “Sample.h”



#include



using namespace std;



class Sample {



public:



Sample();



friend ostream %26amp;operator<<(ostream %26amp;out, const Sample s);



friend istream %26amp;operator>>(istream %26amp;in, Sample %26amp; s);



private:



int x;



};
// 实现文件 “Sample.cpp”



#include “Sample.h”



Sample::Sample() {



x=0;



}



istream %26amp;operator>>(istream %26amp;in, Sample %26amp; s) {



cout<<”Please enter a value”<> s.x ;



return in;



}



ostream %26amp;operator<<(ostream %26amp;out, const Sample s) {



cout << s.x << endl;



return out;



}

以上代码在gnuc++中编译运行毫无问题。但是在VC++6.0中编译的时候就会出现以下的编译错误:

Compiling%26#8230;
Sample.cpp
c:/temp/sample.cpp(8) : error C2248: %26#8216;x%26#8217; : cannot access private member declared in class %26#8216;Sample%26#8217;
c:/temp/sample.h(19) : see declaration of %26#8216;x%26#8217;
c:/temp/sample.cpp(13) : error C2248: %26#8216;x%26#8217; : cannot access private member declared in class %26#8216;Sample%26#8217;
c:/temp/sample.h(19) : see declaration of %26#8216;x%26#8217;
Error executing cl.exe.Sample.obj - 2 error(s), 0 warning(s)

在VC++ 6.0中解决这个问题有以下几种方法:

  • 在头文件中实现作为朋友函数的操作符函数的重载,也就是说在实现文件”Sample.cpp”中将函数重载的实现去掉,而将头文件修改如下:
    // 修改后的头文件 1 “Sample.h”



    #include



    using namespace std;



    class Sample {



    public:



    Sample();



    friend ostream %26amp;operator<<(ostream %26amp;out, const Sample s);



    friend ostream %26amp;operator<<(ostream %26amp;out, const Sample s) {



    cout << s.x << endl;



    return out;



    }





    friend istream %26amp;operator>>(istream %26amp;in, Sample %26amp; s);



    friend istream %26amp;operator>>(istream %26amp;in, Sample %26amp; s) {



    cout<<”Please enter a value”<> s.x ;



    return in;



    }





    private:



    int x;



    };
  • 在头文件中类定义之前将类和朋友操作符函数的原型特别声明一下,也就是将头文件修改如下(实现文件”Sample.cpp”不用作任何修改):
    // 修改后的头文件 2 “Sample.h”



    #include



    using namespace std;



    // 以下3行代码为新加入



    class Sample;



    ostream %26amp;operator<<(ostream %26amp;out, const Sample s);



    istream %26amp;operator>>(istream %26amp;in, Sample %26amp; s);





    class Sample {



    public:



    Sample();



    friend ostream %26amp;operator<<(ostream %26amp;out, const Sample s);



    friend istream %26amp;operator>>(istream %26amp;in, Sample %26amp; s);



    private:



    int x;



    };
  • 第三种方法是对I/O名空间的使用实行明确声明,也就是说在头文件”Sample.h”中直接写:
    #include
    using std::ostream;
    using std::istream
    %26#8230;.
    取代 “using namespace std;”
    注 意:在这个例子里我们在实现文件 “Sample.cpp”中包含 “using namespace std;”这句话,否则在实现中就不能使用 “cout” , “cin”, “<< “, “>>” 和 endl 这些关键字和符号。修改后的完整代码如下:

     

    // Sample.h



    #include



    using std::istream;



    using std::ostream;





    class Sample {



    public:



    Sample();



    friend ostream %26amp;operator<<(ostream %26amp;out, const Sample s);



    /*friend ostream %26amp;operator<<(ostream %26amp;out, const Sample s) {



    cout << s.x << endl;



    return out;



    }*/



    friend istream %26amp;operator>>(istream %26amp;in, Sample %26amp; s);



    /*friend istream %26amp;operator>>(istream %26amp;in, Sample %26amp; s) {



    cout<<”Please enter a value”<> s.x ;



    return in;



    }*/



    private:



    int x;



    };
    // “Sample.cpp”



    #include “Sample.h”



    using namespace std;



    Sample::Sample() {



    x=5;



    }



    istream %26amp;operator>>(istream %26amp;in, Sample %26amp; s) {



    cout<<”Please enter a value”<> s.x ;



    return in;



    }



    ostream %26amp;operator<<(ostream %26amp;out, const Sample s) {



    cout << s.x << endl;



    return out;



    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值