About The Order of The Declarations And Definition When Making a Member Function a Friend.关于使类成员成为另一个类友元函数的声明顺序和定义。

If only member function clear of WindowMgr is a friend of Screen, there are some points need to note. Sequence is important.

  • First, define the WindowMgr class in WindowMgr.h, which declares, but cannot define clear function. Screen must be declared before clear can use the members of Screen.

  • Next, define class Screen in Screen. h, including a friend declaration for clear.

  • Finally, define clear in WindowMgr.cpp, which can now refer to the members in Screen.

    When trying to separate class WindowMgr and class Screen in different files for a better decoupling, placed "#include 'Screen.h" statement in front of class WindowMgr`s declare will cause that the friend declaration for clear in Screen.h can't find the corresponding function, because when declaring class Screen surrounding scope can't see the declaration of WindowMgr.

    So the resolution is placing "#include Screen.h" statement in bottom of class WindowMgr s declaration and forward declaration class Screen for WindowMgr.h, or declare a friend for class WindowMgr.

如果 WindowMgr 的成员函数 clearScreen 的友元函数,则需要注意一些要点。顺序很重要。

  • 首先,在WindowMgr.h中定义 WindowMgr 类,只是进行类声明,但不能定义clear函数。必须在clear之前声明 Screen 才能使用 Screen 的成员。
  • 接下来,在Screen中定义class Screen . h,包括 clear 的朋友声明。
  • 最后,在WindowMgr.cpp中定义 clear,它现在可以引用 Screen 中的成员。

当试图在不同的文件中分离类 WindowMgr 和类 Screen 以获得更好的解耦效果时,在类 WindowMgr 的声明前面放置 "#include 'Screen.h" 语句将导致在Screen.h中声明的友元不能找到相应的函数,因为在声明类 Screen 时,周围的作用域无法看到 WindowMgr 的声明。

因此,解决方案是将“#include Screen.h”语句放在类 WindowMgr 的声明的底部,并且在WindowMgr.h中前向声明类 Screen 。或者直接为类 WindowMgr 声明一个友元类 Screen

posted @ 2019-01-18 15:21  威化饼干  阅读(137)  评论(0编辑  收藏  举报