1. 程式人生 > >舉例說明C++友元類的作用

舉例說明C++友元類的作用

如下所示例,class A與class B並沒有繼承關係,但是我們想讓A直接訪問B的私有變數,則可以將class B作為class A的友元。

#include <iostream>

using namespace std;

class A
{
	class B
	{
		private:
						int a;
						int b;
		friend class A;
	};
	B b;

	public:
	void init_b()
	{
		b.a=1;
		b.b=2;
		cout << b.a << endl;
		cout << b.b << endl;
	}

};

int main()
{
	A a;
	a.init_b();


	return 0;
}

再來舉一個更加形象的例子,來源於別人的部落格
https://www.cnblogs.com/renzhuang/articles/6592024.html

假設我們要設計一個模擬電視機和遙控器的程式。大家都之道,遙控機類和電視機類是不相包含的,而且,遙控器可以操作電視機,但是電視機無法操作遙控器,這就比較符合友元的特性了。即我們把遙控器類說明成電視機類的友元。下面是這個例子的具體程式碼:

複製程式碼
  1 #include <iostream>
  2 using namespace std;
  3 class TV 
  4 {
  5     public:
  6       friend class Tele;
  7       TV():on_off(off),volume(20),channel(3),mode(tv){}
  8     private:    
  9       enum{on,off};
 10       enum{tv,av};
 11       enum{minve,maxve=100};
 12       enum{mincl,maxcl=60};
 13       bool on_off;
 14       int  volume;
 15       int channel;
 16       int mode;
 17 };
 18 class Tele
 19 {
 20     public:
 21        void OnOFF(TV&t){t.on_off=(t.on_off==t.on)?t.off:t.on;}
 22        void SetMode(TV&t){t.mode=(t.mode==t.tv)?t.av:t.tv;}
 23        bool VolumeUp(TV&t);
 24        bool VolumeDown(TV&t);
 25        bool ChannelUp(TV&t);
 26        bool ChannelDown(TV&t);
 27        void show(TV&t)const;    
 28 };
 29 bool Tele::VolumeUp(TV&t)
 30 {
 31     if (t.volume<t.maxve)
 32     {
 33         t.volume++;
 34         return true;
 35     } 
 36     else
 37     {
 38         return false;
 39     }
 40 }
 41 bool Tele::VolumeDown(TV&t)
 42 {
 43     if (t.volume>t.minve)
 44     {
 45         t.volume--;
 46         return true;
 47     } 
 48     else
 49     {
 50         return false;
 51     }
 52 }
 53 bool Tele::ChannelUp(TV&t)
 54 {
 55     if (t.channel<t.maxcl)
 56     {
 57         t.channel++;
 58         return true;
 59     } 
 60     else
 61     {
 62         return false;
 63     }
 64 }
 65 bool Tele::ChannelDown(TV&t)
 66 {
 67     if (t.channel>t.mincl)
 68     {
 69         t.channel--;
 70         return true;
 71     } 
 72     else
 73     {
 74         return false;
 75     }
 76 }
 77 void Tele::show(TV&t)const
 78 {
 79     if (t.on_off==t.on)
 80     {
 81         cout<<"電視現在"<<(t.on_off==t.on?"開啟":"關閉")<<endl;
 82         cout<<"音量大小為:"<<t.volume<<endl;
 83         cout<<"訊號接收模式為:"<<(t.mode==t.av?"AV":"TV")<<endl;
 84         cout<<"頻道為:"<<t.channel<<endl;
 85  
 86     } 
 87     else
 88     {
 89         cout<<"電視現在"<<(t.on_off==t.on?"開啟":"關閉")<<endl;
 90     }
 91      
 92 }
 93 int main()
 94 {
 95     Tele t1;
 96     TV t2;
 97     t1.show(t2);
 98     t1.OnOFF(t2);
 99     t1.show(t2);
100     cout<<"調大聲音"<<endl;
101     t1.VolumeUp(t2);
102     cout<<"頻道+1"<<endl;
103     t1.ChannelUp(t2);
104     cout<<"轉換模式"<<endl;
105     t1.SetMode(t2);
106     t1.show(t2);
107     return 0;
108 }
複製程式碼
我們在程式的第6行定義了一個TV電視機類的友元類Tele。那麼程式中就可以來呼叫TV類中的私有成員。