有两个类关系如下:
Keyboard.h:
Class Computer;
Class Keyboard
{
public:
void BtnW();
void BtnS();
void BtnA();
void BtnD();
void BtnSleep(Computer &cmpt);
}
Keyboard.cpp:
#include Keyboard.h
void Keyboard::BtnSleep(Computer &cmpt)
{
cmpt.Sleep();
}
//else funs
Computer.h:
#include Keyboard.h
#include Mouse.h
#include ComputerHost.h
#include Displayer.h
Class Computer
{
public:
Keyboard m_keyboard;
Mouse m_mouse;
ComputerHost m_computerHost;
Displayer m_displayer;
void Game();
void DealWord();
private:
void Sleep();
void ShutDown();
void LogOut();
//else functions
}
Keyboard类中的BtnSleep()方法想要调用Computer类中的私有方法Sleep(),显然编译器将会报错,为了使调用能够顺利进行,我们告诉Computer类Keyboard类中的BtnSleep()方法是他的朋友,即友元函数,Computer.h修改如下:
#include Keyboard.h
#include Mouse.h
#include ComputerHost.h
#include Displayer.h
Class Computer
{
public:
Keyboard m_keyboard;
Mouse m_mouse;
ComputerHost m_computerHost;
Displayer m_displayer;
friend void Keyboard::BtnSleep();
void Game();
void DealWord();
private:
void Sleep();
void ShutDown();
void LogOut();
//else functions
}
修改点仅在于增加了一行:
friend void Keyboard::BtnSleep();
问题解决,编译成功。
接下来我们将Keyboard类的功能继续扩展,增加BtnShutDown()方法和BtnLogOut()方法,他们分别调用的是Computer类中的ShutDown()方法和LogOut()方法,如果再按照增加友元函数的方法一一声明,过于繁琐,也不利于后期扩展,那么这种情况下,可以直接将Keyboard类声明为Computer类的友元,即友元类,Computer.h修改如下:
#include Keyboard.h
#include Mouse.h
#include ComputerHost.h
#include Displayer.h
Class Computer
{
public:
Keyboard m_keyboard;
Mouse m_mouse;
ComputerHost m_computerHost;
Displayer m_displayer;
friend class Keyboard;
void Game();
void DealWord();
private:
void Sleep();
void ShutDown();
void LogOut();
//else functions
}