关于类的友元函数实现解析

编程时碰到这个问题,现在把这个问题搞清楚,和大家分享一下~

    如果想设置友元函数的话,那么在这个过程中就必须先定义类型,然后再定义实现的细节。如果在这个过程中友元函数。在类中定义友元的时候必须前项声明。但是声明之后的类在引用的过程中不能涉及到类的具体细节,因为在声明的过程中本生就没有涉及到细节(即类的变量和方法),从编译器的角度来说的话就是编译器现看到声明,知道这是一个类,如果要用到类中的变量必须在类定义之后才能使用。下面举个例子:
现定义两个类:
class Screen
{
  public:
  Screen(int h.int w):height(h),width(w){}
  friend Window_mgr::reset(Screen&,int x,int y);
  private:
   int height;
   int width;
};
class Window_mgr
{
  public:
    Window_mgr(int h,int w):height(h),width(w){}
    void reset(Screen&,int x,int y);
 private:
   int height;
   int width;
};
如果此时我们就将这两个类放在文件里,那是行不通的,因为无论那个类放在前面,它都不能完成编译。class Screen放在前面,当编译器编译到friend的时候,它在查找Window_mgr。此时没有声明Window_mgr是什么。所以此编译器出错,再者,将Window_mgr放在前面也是同样的道理。因此我们首先要现声明下一个类。那么究竟那个类放在前面用作声明呢?
我们现在还不清楚,那么假定Screen放在前面声明;
class Screen;
后面紧跟的应该是Window_mgr,因为如果不是Window_mgr那么声明也没有意义。
class Window_mgr;
class Screen
{
  public:
  Screen(int h.int w):height(h),width(w){}
  friend Window_mgr::reset(Screen&,int x,int y);
  private:
   int height;
   int width;
};
那么自然后面就跟这Window_mgr
表面看起来似乎差不多,但是细究下Scren的代码
friend void Window_mgr::reset(Screen&,int x,int y)
因为前面只是声明了Window_mgr是一个类,对于类里面的细节我们还不清楚。所以我们不能对一个不清楚里面内容的类进行操作。所以我们应该将Screen类放在前面声明,后面进紧跟着Window_mgr;
如下:
class Screen;
class Window_mgr
{
  public:
    Window_mgr(int h,int w):height(h),width(w){}
    void reset(Screen&,int x,int y);
 private:
   int height;
   int width;
};
class Screen
{
  public:
  Screen(int h.int w):height(h),width(w){}
  friend Window_mgr::reset(Screen&,int x,int y);
  private:
   int height;
   int width;
};
值得注意是声明类的时候,我们不能去使用该声明类中的细节,因为编译器无法知道你声明的类中是什么内容。只有当编译器编译到该类的时候才知道类中是什么~
我们拓展一下:
如果此时在class Window_mgr中还包含了reset方法的实现的话:
例如:
class Window_mgr
{
  public:
    Window_mgr(int h,int w):height(h),width(w){}
    void reset(Screen& myscreen,int x,int y)
   {
      myscreen.height+=x;
     myscreen.width+=y;
    }
 private:
   int height;
   int width;
};
那么上面的的程序又出错了,为什么呢?
因为我们在Window_mgr定义的时候只是声明了Screen,并没有说明Screen中还存在这height和width。
因此上述函数的实现不能在类中进行而是应该放到Screen类后面来实现。可以放在实现文件cpp中实现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值