友元在类中的使用

友元在类中的使用一般分为两种:
(1) 友元类
(2) 友元函数

关于友元类:
友元类的使用和声明极为简单,只需在需要访问的类中加上friend class Classname 即可 。这样被声明的友元类即可访问声明处的类的所有成员,
同时声明的位置不限只需要在类中即可。

//     Tv 是一个类,而Remote则是Tv的遥控器,很显然Remote需要使用Tv
//     中的数据进行操作,此时可声明为友元类。
#ifndef TV_H_
#define TV_H_

class Tv{
private:
                int state ;
                int volume ;
                int maxchannel ;
                int channel ;
                int mode ;
                int input ;
    public:
                class friend Remote ;  
                // 声明友元类 ,Remote类可以直接访问Tv类的成员
                //   在类中任何地方声明皆可
                statements ;
};

关于友元函数:
实际上在大多数情况下,类中的数据交互只在几个函数间,太多的数据交互反而增加了错误的可能;所以在只有少量的数据交互时,不需要声明友元类,使用友元函数就可以了。
(1) 友元函数作为类的成员
还是以之前的Tv与Remote为例:
如果说很多关于Tv本身的操作都被封装成了函数,外部的Remote类只需要
调用其函数就可以改变Tv的状态,且只有少部分数据需要同外界的类直接
交互。那么,这时最好的方式就是使用为类成员的友元函数。

    class Tv
    {
        private:
                int state ;
                int volume ;
                int maxchannel ;
                int channel ;
                int mode ;
                int input ;
        public:
                friend void Remote::set_channel(Tv & tv , int c) ;
                //       声明友元函数,这个函数是Remote类的成员
                //       在声明后Remote类可以直接通过set_channel函数进行操作
                //       而不需要使用友元类
                statements of funcs in the Tv class ;
        }

但注意这里会遇到一个声明顺序的问题!
由于在tv类中有着remote类的一个具体实现的函数声明,故而关于
remote类的声明需要放在tv类的前面!同时tv类需要预声明:

            class Tv ;
            class Remote { ...... } ;
            class Tv{ ...... } ;

(2) 友元函数作为普通函数
在部分情况下,数据间的共享或者同步,不是发生在类间的,
而是通过使用外部的函数进行。那么则是需要使用,普通函数作为
友元函数。
在需要同步或共享的类的类中声明普通函数的友元,在普通函数实现
数据的同步与共享,犹如一个第三方的接口。

猜你喜欢

转载自blog.51cto.com/13824643/2135288