VC6.0中友元函数无法访问类私有成员的解决办法
举个例子:
| 
 2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
 | 
#include<iostream> using namespace std; class cylinder {     friend istream operator>>(istream& is,cylinder &cy); public:         inline double square()     {       return length*(width+height)*2+width*height*2;    }     inline double volume()     {      return length*width*height;      } private:     double length;     double width;     double height; }; istream operator>>(istream is,cylinder &cy) {     cout<<"input length:"<<endl;     is>>cy.length;     cout<<"input width:"<<endl;     is>>cy.width;     cout<<"input height:"<<endl;     is>>cy.height;     return is; } int main() {     cylinder first;     cin>>first;     cout<<first.square()<<endl;     cout<<first.volume()<<endl;     return 0; } | 
这些代码在VC6.0中不能被编译通过:提示不能访问私有成员,没有这个访问权限
改成这样就可以了,代码如下:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
 | 
#include<iostream> using std::cin; using std::endl; using std::cout; using std::ostream; using std::istream; using std::ostream; class cylinder {     friend istream operator>>(istream& is,cylinder &cy); public:         inline double square()     {       return length*(width+height)*2+width*height*2;    }     inline double volume()     {      return length*width*height;      } private:     double length;     double width;     double height; }; istream operator>>(istream is,cylinder &cy) {     cout<<"input length:"<<endl;     is>>cy.length;     cout<<"input width:"<<endl;     is>>cy.width;     cout<<"input height:"<<endl;     is>>cy.height;     return is; } int main() {     cylinder first;     cin>>first;     cout<<first.square()<<endl;     cout<<first.volume()<<endl;     return 0; } | 
原因:
这据说是VC的一个经典BUG。和namespace也有关.
只要含有using namespace std; 就会提示友员函数没有访问私有成员的权限。
解决方法:
去掉using namespace std;换成更小的名字空间。
例如: 
                                                                                                                 含有#include <string>就要加上using std::string 
                                                                                                                 含有#include <fstream>就要加上using std::fstream 
                                                                                                                 含有#include <iostream>就要加上using std::cin; using std::cout; using std::ostream; using std::istream; using std::endl;需要什么即可通过using声明什么.
下面给出流浪给的解决办法:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
 | 
//方法一://提前声明class cylinder;istream &operator>>(istream& is,cylinder &cy);//方法二://不用命名空间#include<iostream.h>//方法三:class cylinder{    friend istream &operator>>(istream& is,cylinder &cy)//写在类里面    {        cout<<"input length:"<<endl;        is>>cy.length;        cout<<"input width:"<<endl;        is>>cy.width;        cout<<"input height:"<<endl;        is>>cy.height;        return is;             } | 
VC6.0中友元函数无法访问类私有成员的解决办法的更多相关文章
- [置顶]        c++,vc6.0,中友元函数,无法访问私有字段(private)的问题(problem),cannot access private member declared in class 'Date'
		
c++,vc6.0,中友元函数,无法访问私有字段(private)的问题(problem),cannot access private member declared in class 'Date' ...
 - 解决"VC6.0的ClassView里不能显示类或成员变量"问题
		
VC6.0是微软1998年公布的,是一款非常经典的编辑器.然而它有几个非经常见的bug,比方, .cpp文件打不开,智能提示出现异常.这里介绍"VC6.0的ClassView里不能显示类或成 ...
 - 在IE浏览器中iframe跨域访问cookie/session丢失的解决办法
		
单点登录需要在需要进入的子系统B中添加一个类,用于接收A系统传过来的参数: @Action(value = "outerLogin", results = { @Result(na ...
 - JPA 不在 persistence.xml 文件中配置每个Entity实体类的2种解决办法
		
在Spring 集成 Hibernate 的JPA方式中,需要在persistence配置文件中定义每一个实体类,这样非常地不方便,远哥目前找到了2种方法. 这2种方式都可以实现不用persist ...
 - AFNetworking 3.0中调用[AFHTTPSessionManager manager]方法导致内存泄漏的解决办法
		
在使用AFNetworking3.0框架,使用Instruments检查Leaks时,检测到1000多个内存泄漏的地方,定位到 [AFHTTPSessionManager manager] 语句中,几 ...
 - php中date函数获取当前时间的时区误差解决办法
		
例:echo date('Y-m-d H:i:s', time()); 输出时间:2008-10-12 02:32:17 但实际时间是:2008-10-12 10:32:17时间误差8个小时 PHP手 ...
 - [C#]通过反射访问类私有成员
		
参考链接: https://www.cnblogs.com/adodo1/p/4328198.html 代码如下: using System; using System.Reflection; usi ...
 - VC6.0中重载操作符函数无法访问类的私有成员
		
整理日: 2015年03月18日 在 C++ 中,操作符(运算符)可以被重载以改写其实际操作.同时我们可以定义一个函数为类的朋友函数(friend function)以便使得这个函数能够访问类的私有成 ...
 - [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
		
首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下: C++ Code 1 2 template < class _Ty, cl ...
 
随机推荐
- System.Windows.Application.Current.Dispatcher.BeginInvoke
			
System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => ...
 - Linux 下MySql 重置密码
			
1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也可以任意地登录 ...
 - What is a Database Trigger?
			
Link: http://www.essentialsql.com/what-is-a-database-trigger/ Copy... What is a Database Trigger? A ...
 - 【Oracle】Oracle 序列步长问题
			
问题: 数据库中客户表的ID 变化为 21\31\41 有序数字,而不是1\2\3 依次增长 [问题原因]: SEQ_CUSTOMNOTEEN 设置了缓存20,每次取20个数,然后一个一个给你,如果中 ...
 - js获取浏览器前缀
			
<script> var div = null; var _prefix = (function (temp) { var prefix = ["webkit", &q ...
 - python 进程和线程
			
python中的进程.线程(threading.multiprocessing.Queue.subprocess) Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就 ...
 - 02.JavaScript基础上
			
JavaScript组成 ECMAScript:解释器.翻译 .平时我们写的代码都是用英文数字之类,而计算机只能读懂0和1,ECMAScript可以把我们写的翻译给计算机,把计算机写的传达给我们DOM ...
 - char和byte的区别
			
char的字符数据类型,是无符号型的,占2个字节:大小范围是0-65535: byte是字节数据类型,是有符号型的,占1个字节:大小范围为-128-127: 1, char c1=3; char c= ...
 - iOS TTF文件使用---改变字体
			
TTF(True Type Font):是一种字库名称 TTF文件:是Apple公司和Microsoft公司共同推出的字体文件格式 使用: 1 获取字体文件 从各种渠道下载字体ttf,网站或从别的ip ...
 - PHP性能监测的工具介绍 - XHProf
			
http://segmentfault.com/a/1190000003509917 http://www.cnblogs.com/casatwy/archive/2013/01/17/2865241 ...