1.友元类
代码:
#include <iostream>
class Tv {
public:friend class Remote;...
};class Remote {...
};
2.友元成员函数
即:不需要整个类成为友元,只需要选择让特定的类成员成为另一个类的友元:
(1)
friend void Remote::set_chan(Tv& v);
分析:这行代码想把class Remote中的set_chan函数作为class Tv的友元。
存在的问题:
编译器必须提前知道Remote是什么,所以Remote应定义在Tv前面。但同时,这个Remote类成员函数又使用了Tv引用作为对象,编译器同样应知道Tv是什么,那么Tv又要定义在Remote前面。
解决办法:前向声明(forward declaration)
代码:
class Tv; //前向声明
class Remote {
public:void set_chan(Tv& v) {};...
}clas Tv{
public:friend void Remote::set_chan(Tv& v) {};...
}
分析:只能前向声明Tv,不能前向声明Remote。因为编译器要看到set_chan()函数的声明。
(2)
若Remote类中有一个这样的成员函数:
void onoff(Tv &t){t.onoff()};
分析:这个函数会使用Tv类的onoff()成员函数。
存在的问题:编译器必须提前知道Tv类中onoff()的声明。但是刚才只对Tv类做了前向声明,Tv类的定义在Remote类之后。
解决办法:在Remote类中,只对成员函数做声明,不做定义实现。将定义部分以Remote::的限制形式放在Tv类定义的后面。
代码:
inline void Remote::onoff(Tv &t){t.onoff();}