C++初探_友元类

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();}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值