举个例子:

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中友元函数无法访问类私有成员的解决办法的更多相关文章

  1. [置顶] 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' ...

  2. 解决&quot;VC6.0的ClassView里不能显示类或成员变量&quot;问题

    VC6.0是微软1998年公布的,是一款非常经典的编辑器.然而它有几个非经常见的bug,比方, .cpp文件打不开,智能提示出现异常.这里介绍"VC6.0的ClassView里不能显示类或成 ...

  3. 在IE浏览器中iframe跨域访问cookie/session丢失的解决办法

    单点登录需要在需要进入的子系统B中添加一个类,用于接收A系统传过来的参数: @Action(value = "outerLogin", results = { @Result(na ...

  4. JPA 不在 persistence.xml 文件中配置每个Entity实体类的2种解决办法

    在Spring 集成 Hibernate 的JPA方式中,需要在persistence配置文件中定义每一个实体类,这样非常地不方便,远哥目前找到了2种方法.   这2种方式都可以实现不用persist ...

  5. AFNetworking 3.0中调用[AFHTTPSessionManager manager]方法导致内存泄漏的解决办法

    在使用AFNetworking3.0框架,使用Instruments检查Leaks时,检测到1000多个内存泄漏的地方,定位到 [AFHTTPSessionManager manager] 语句中,几 ...

  6. 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手 ...

  7. [C#]通过反射访问类私有成员

    参考链接: https://www.cnblogs.com/adodo1/p/4328198.html 代码如下: using System; using System.Reflection; usi ...

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

    整理日: 2015年03月18日 在 C++ 中,操作符(运算符)可以被重载以改写其实际操作.同时我们可以定义一个函数为类的朋友函数(friend function)以便使得这个函数能够访问类的私有成 ...

  9. [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:  C++ Code  1 2   template < class _Ty, cl ...

随机推荐

  1. 自己写了一个无缝滚动的插件(jQuery)

    效果图: html代码: 1 <h1>无缝滚动,向右滚动</h1> 2 <ul id="guoul1"> 3 <li><img ...

  2. bzoj 3791: 作业

    Description 众所周知,白神是具有神奇的能力的. 比如说,他对数学作业说一声“数”,数学作业就会出于畏惧而自己完成:对语文作业说一声“语”,语文作业就会出于畏惧而自己完成. 今天,语文老师和 ...

  3. tomcat服务器奇异事件

    我在A电脑里面启动服务器,服务器里面之前上传了XX文件,然后在A电脑浏览器能访问到(但是修改无效),在B电脑也能访问到(修改有效果),现在我把A电脑里面的文件删除,在A电脑都能访问到但是修改不了文件, ...

  4. HDU 3032 Nim or not Nim?(sg函数)

    题目链接 暴力出来,竟然眼花了以为sg(i) = i啊....看表要认真啊!!! #include <cstdio> #include <cstring> #include & ...

  5. 更换app开发者账号

    在开源中国上面有一个答案,http://www.oschina.net/question/2307266_237220 下面是我的执行步骤 首先在iTunes Connect中找到要更换开发者账号的a ...

  6. Android 之 ListView的学习

    ListView 是一个控件,一个在垂直滚动的列表中显示条目的一个控件,这些条目的内容来自于一个ListAdapter .EditText Button TextView ImageView Chec ...

  7. 安卓中級教程(6):annotation的基本用法

    package com.example.ele_me.activity; import android.annotation.SuppressLint; import android.app.Acti ...

  8. windows2013 iis 配置 xcache

    本帖最后由 artsharp 于 2010-6-8 09:06 编辑XCache是一种新的php缓存器,经过测试,在Windows下效果比同类软件强很多.实际测试效果如下(非科学方法):原网页平均执行 ...

  9. GIT如何添加权限模块

    http://blog.chinaunix.net/uid-15174104-id-3843570.html

  10. ubuntu开启SSH服务

    SSH分客户端openssh-client和openssh-server 如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有则sudo apt-g ...