`
yfy_cpp
  • 浏览: 12234 次
  • 来自: 南昌
最近访客 更多访客>>
社区版块
存档分类
最新评论

VC6.0中友元函数无法访问类私有成员的解决办法

阅读更多
原文地址:

今天又碰到这个问题,由于以前没有记笔记的习惯,所以碰到这个问题之后纠结了很久。友元函数本来就是给那些既需要访问类成员而又不能作为相关类的成员的函数或者类来访问类私有变量的方法。从这儿可以看出,友元函数会破坏类的封装性,所以还是少用为妙。

#include "iostream"
using namespace std;
class MyClass
{

public:
	double val;
	MyClass(){a = b = 0;}
	MyClass(int x, int y)
	{
		a = x;
		b = y;
		val = 0.0;
	}
	~MyClass()
	{
		cout << "Destructing MyClass(" << a << ", " << b << ")" << endl;
	}
	int sum()
	{
		return a + b;
	}
	friend ostream &operator<<(std::ostream &strm, const MyClass &obj);
private:
		int a, b;
};
ostream &operator<<(ostream &strm, const MyClass &obj)//
{
	strm << "(" << obj.a << " " << obj.b << ")";
	return strm;
}
int main(){


	return 0;
}


当我在VC6.0上像这样写代码时,编译器报如下错误:

引用
Compiling...
test.cpp
D:\VCProject\FriendTest\test.cpp(33) : error C2248: 'a' : cannot access private member declared in class 'MyClass'
        D:\VCProject\FriendTest\test.cpp(29) : see declaration of 'a'
D:\VCProject\FriendTest\test.cpp(33) : error C2248: 'b' : cannot access private member declared in class 'MyClass'
        D:\VCProject\FriendTest\test.cpp(29) : see declaration of 'b'


上网一查,发现这是VC6.0的一个经典BUG,是VC6.0对友元函数的支持不够,同时跟namespace也有关系。

于是,有两种方式可以解决这个问题:

方式一:注释掉 using namespace std;加上如下声明:
using std::cout;
using std::endl;
using std::ostream;


完整代码如下:

#include "iostream"
//using namespace std;
using std::cout;
using std::endl;
using std::ostream;

class MyClass
{

public:
	double val;
	MyClass(){a = b = 0;}
	MyClass(int x, int y)
	{
		a = x;
		b = y;
		val = 0.0;
	}
	~MyClass()
	{
		cout << "Destructing MyClass(" << a << ", " << b << ")" << endl;
	}
	int sum()
	{
		return a + b;
	}
	friend ostream &operator<<(std::ostream &strm, const MyClass &obj);
private:
		int a, b;
};
ostream &operator<<(ostream &strm, const MyClass &obj)//
{
	strm << "(" << obj.a << " " << obj.b << ")";
	return strm;
}
int main(){


	return 0;
}


方法二:在程序中不使用 namespace,把头文件替换为 .h , 如:
#include "iostream.h"
// using namespace std;


完整源代码如下:

#include "iostream.h"
//using namespace std;
class MyClass
{

public:
double val;
MyClass(){a = b = 0;}
MyClass(int x, int y)
{
a = x;
b = y;
val = 0.0;
}
~MyClass()
{
cout << "Destructing MyClass(" << a << ", " << b << ")" << endl;
}
int sum()
{
return a + b;
}
friend ostream &operator<<(std::ostream &strm, const MyClass &obj);
private:
int a, b;
};
ostream &operator<<(ostream &strm, const MyClass &obj)//
{
strm << "(" << obj.a << " " << obj.b << ")";
return strm;
}
int main(){


return 0;
}
分享到:
评论

相关推荐

    C++ 中友元函数与友元类详解

    C++ 中友元函数与友元类详解 总的来说,友元分为两类:友元函数与友元类。友元是针对类而言,它提供了一种非类的成员函数来访问类的非公有成员的一种机制。可以把一个函数指定为某类的友元,这个函数称为这个类的...

    cpp_200706_友元函数_

    C++中友元函数的例子,可以通过这些例子认识友元函数

    C++中友元的实例详解

    C++中友元的实例详解 尽管友元被授予从外部访问类的私有部分的权限,但他们并不与面向对象的编程思想相悖;相反他提高了公共接口的灵活性。 一、友元类 友元声明可以位于公有、私有活保护部分、其所在位置无关紧要...

    C++中友元的三个例子

    友元的三个例子,比较直观的说明了C++中友元的概念。

    在C++中关于友元函数的进一步理解

    今天小编就为大家分享一篇关于在C++中关于友元函数的进一步理解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    C++友员程序

    C++中友员函数的使用举例。以学生老师类为例

    IBM助力中友百货信息化建设

    北京中友百货商场与IBM合作,选择IBMeServerx系列服务器及TotalStorage存储解决方案升级其核心收银系统,从而成为全国零售百货行业首个应用64位工业标准服务器平台的大型商家。

    友元类(C++基础教学)

    如何声明和创建友元类 简单友元类的声明,C++中友元类的应用范围

    卖场布局:台湾中友百货的卫生间设计

    超市管理的目标基本以消费者对象而确定,提供的卖场布局:台湾中友百货的卫生间设计能够给你学...该文档为卖场布局:台湾中友百货的卫生间设计,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看

    C++友元(Friend)用法实例简介

    相对于Java而言,友元是C++中特有的一种元素,很多教材上对其介绍的相对较少,因此初学的时候往往不能很快掌握,本文总结了友元的用法和一些注意的...1)Father类中创建的MyFriend对象允许直接访问MyFriend类中所有变量

    探究网络安全态势感知系统关键技术.pdf

    探究网络安全态势感知系统关键技术.pdf

    C++基础-友元专题

    详细介绍了C++中友元的使用,适合C++入门者参考学习。

    C++学习实例

    C++中友元和重载实例,由求两点的距离说明友元函数的概念和使用。由实例说明++,--重载

    java 中的经典递归

    经典递归!!中友很多经典的递归我们不防来看看

    用友t3操作流程

    中友操作环境的安装及操作详细,又规范的符合了大中小型企业,为单位会计合理

    长纤维增强聚酰胺制件翘曲因素的正交实验研究

    长纤维增强聚酰胺制件翘曲因素的正交实验研究,曹文钢,吴中友,翘曲变形是塑料制件常见的缺陷之一,导致翘曲变形的因素有很多且影响大小也不一样。本文研究了模具温度、熔体温度、开模时间、注

    2010全球十大微博客产品评测(40P)

    微博客服务是目前互联网最热门的服务,用户可以利用PC、手机等各种可连接网络的终端应用访问微博客服务,将自己的最新动态和想法以短消息的形式发送给好友或者追随者。与传统博客不同的是,用户可以随时随地用各种...

    Yii相关资料

    它将 Web 编程中的可重用性发挥到极致,能够显著加速开发进程。Yii(读作“易”)代表简单(easy)、高效(efficient)、可扩展...此资源中友Yii安装包,Yii API,Yii 使用手册、文档以及多本Yii相关的PDF电子书。

Global site tag (gtag.js) - Google Analytics