C++中友元类使用场合
在C++中我們可以將函數(shù)定義成類的友元函數(shù),這樣在函數(shù)中就可以訪問類的私有成員。與函數(shù)相同,類也可以作為另一個(gè)類的友元類,在友元類中可以訪問另外一個(gè)類的所有成員。
聲明友元類的方法很簡單,只需在類中寫下如下語句:
friend class 類名;
接下來我們看一個(gè)案例,假如我們需要設(shè)計(jì)一個(gè)模擬電視機(jī)和遙控器的程序,代碼如下。
#include <iostream>
using namespace std;
class TV
{
private:
enum{on,off};
enum{minvol,maxvol=100};
enum{minchn,maxchn=40};
bool on_off;
int volume;
int channel;
public:
TV():on_off(off),volume(20),channel(3){};
//打印屬性
void print_tv_info()
{
cout<<"on_off:"<<on_off<<endl;
cout<<"volume:"<<volume<<endl;
cout<<"channel:"<<channel<<endl;
}
//此處將TVController類聲明為TV類的友元類
friend class TVController;
};
class TVController
{
public:
void set_status(TV& t){t.on_off = (t.on_off == t.on ? t.off : t.on);}
bool volume_up(TV& t);
bool volume_down(TV& t);
bool channel_up(TV& t);
bool channel_down(TV& t);
};
//TVController 函數(shù)定義
bool TVController::volume_up(TV& t)
{
if(t.volume < t.maxvol)
{
t.volume++;
return true;
}
return false;
}
bool TVController::volume_down(TV& t)
{
if(t.volume > t.minvol)
{
t.volume--;
return true;
}
return false;
}
bool TVController::channel_up(TV& t)
{
if(t.channel < t.maxchn)
{
t.channel ++;
return true;
}
return false;
}
bool TVController::channel_down(TV& t)
{
if(t.channel > t.minchn)
{
t.channel --;
return true;
}
return false;
}
int main(int argc,char* argv[]) {
TV mytv;
TVController ctl;
ctl.set_status(mytv);
ctl.volume_down(mytv);
ctl.channel_up(mytv);
mytv.print_tv_info();
return 0;
}
我們定義了一個(gè)TV類和TVController分別表示電視機(jī)和遙控器。在電視機(jī)類有一些常用的屬性,如:開關(guān)、頻道、音量。我們分別用on_off、volume、channel變量表示;在遙控器類(TVController)中我們聲明了以下方法來控制電視類:
//開關(guān)電視機(jī)
void set_status(TV& t){t.on_off = (t.on_off == t.on ? t.off : t.on);}
//增大音量
bool volume_up(TV& t);
//減小音量
bool volume_down(TV& t);
//加頻道
bool channel_up(TV& t);
//減頻道
bool channel_down(TV& t);
在這些方法中我們都需要訪問TV類的成員變量,有兩種方法,第一種是把TV類的成員變量都聲明為public,但是這種做法顯然不符合面向?qū)ο缶幊汤砟畹摹A硪环N是為每個(gè)屬性增加set,get方法(例如:set_channel,get_channel),TVController類中對TV類的屬性訪問比較頻繁,這樣做代碼會(huì)顯得特別冗余,邏輯也不直觀。
這時(shí)我們就需要將TVController類聲明為TV類的友元類,具體做法是在TV類的聲明中添加友元類的聲明語句:
friend class TVController;
在main函數(shù)中我們定義TV類的對象mytv初始值為{on_off:1,volume:20,channel:5}和TVController 類的對象ctl,通過ctl對象的方法改變mytv對象的屬性值。
執(zhí)行程序輸出:
on_off:0
volume:19
channel:4
總結(jié)
以上是生活随笔為你收集整理的C++中友元类使用场合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《心动小镇》钓鱼攻略
- 下一篇: 交互 点击变色_明年旗舰机必将标配!电致