friend 的出现,是为了让某些类或者方法(包括成员方法或global function)能够访问另外一个类的private 成员变量而诞生.
//class CWindowMgr
void CWindowMgr::echoScreenWH(CScreen sc)
{
printf("the screen width=%d and heigth=%d \n",sc.m_width,sc.m_height);
}
// class CDisplay
void CDisplay::displayScreen(const CScreen & sc)
{
printf("the screen width=%d and heigth=%d \n",sc.m_width,sc.m_height);
}
//由于我们要在 CScreen声明这两个类或者CDisplay::displayScreen()中的这个方法,作为CScreen的友元,所以这两个类要先于CScreen的声明.由于我们要在
//CScreen ,CDisplay::displayScreen()中访问CScreen的private member ,所以,他们的定义要后于CScreen的定义,否则都看不到CScreen的变量.
//由于我们把各类的声明放在单独的文件中,所以,这些顺序被编译器处理了. 而对于global 的function ,其实在声明friend的时候就已经是这个function 的声明了,所以我们可以直接
//定义
#include "WindowMgr.h"
#include "Display.h"
class CScreen
{
public:
CScreen(void);
~CScreen(void);
private:
int m_width;
int m_height;
public:
void setScreenWH(int sw, int sh);
//friend element
friend class CWindowMgr;//grand frient to calss CWindowMgr,定义整个类为CScreen的友元,由于友元不是类的成员所以我们没有这样写:
// friend class CWindowMgr m_mgr;
friend void CDisplay::displayScreen(const CScreen & sc);//grand friend to calss memberfucntion,类中的一个方法做为友元,把那个个类的方法声明copy 过来,
//然后前面加上friend 就可以了.
friend void gdisplayScreen(const CScreen & sc); //global function ,no need to foward declarsion.her is the declarsion
//全局函数,声明友元的同时就已经是声明了这个函数
};
//usage
#include "stdafx.h"
#include "Screen.h"
void gdisplayScreen(const CScreen & sc)
{
printf("the screen width=%d and heigth=%d \n",sc.m_width,sc.m_height);
}
int _tmain(int argc, _TCHAR* argv[])
{
CScreen sc;
CWindowMgr sm;
CDisplay cd;
sc.setScreenWH(100,24);
sm.echoScreenWH(sc);
cd.displayScreen(sc);
gdisplayScreen(sc);
getchar();
return 0;
}