• 成员函数作为友元


      成员函数作为友元,只能是一种顺序.因为我们必须明确指出该成员函数属于哪个类,只有类的声明而无定义,无法在友元声明中指出该成员函数所属的类.以window_mgr类的成员函数clear作为Screen类的友元为例.

    必须先定义window_mgr类,而不能先定义Screen类(此时会对window_mgr作前向声明).

     1 #include <iostream>
     2 #include <string>
     3 
     4 using std::string;
     5 using std::cout;
     6 using std::endl;
     7 
     8 #if 0//正确的形式
     9 class window_mgr {
    10 public:
    11     void clear();
    12 };
    13 
    14 class Screen {
    15 friend void window_mgr::clear();
    16 private:
    17     string contents;
    18 public:
    19     Screen() = default;
    20     Screen(char c) : contents(10, c) {}
    21 };
    22 
    23 void window_mgr::clear()
    24 {
    25     Screen myScreen('b');
    26     cout << "清理之前:" << endl;
    27     cout << myScreen.contents << endl;
    28     myScreen.contents = "";
    29     cout << "清理之后:" << endl;
    30     cout << myScreen.contents << endl;
    31     cout << "================================" << endl;
    32 }
    33 
    34 int main()
    35 {
    36     window_mgr w;
    37     w.clear();
    38     return 0;
    39 }
    40 
    41 
    42 #else if                //!!!测试 : 错误的方式.
    43 class window_mgr;
    44 //void window_mgr::clear();
    45 class Screen {
    46     friend void window_mgr::clear();//只有声明而无定义:无法访问window_mgr的成员函数clear.
    47 private:
    48     string contents;
    49 public:
    50     Screen() = default;
    51     Screen(char c) : contents(10, c) {}
    52 };
    53 
    54 class window_mgr {
    55 public:
    56     void clear();
    57 };
    58 
    59 void window_mgr::clear()
    60 {
    61     Screen myScreen('b');
    62     cout << "清理之前:" << endl;
    63     cout << myScreen.contents << endl;
    64     myScreen.contents = "";
    65     cout << "清理之后:" << endl;
    66     cout << myScreen.contents << endl;
    67     cout << "================================" << endl;
    68 }
    69 
    70 int main()
    71 {
    72     window_mgr w;
    73     w.clear();
    74     return 0;
    75 }
    76 #endif

      启用42行后面的代码,编译器(VS2015)给出的错误提示如下:

      从46行的错误提示可以看出,尽管只是用作友元声明,未定义的类(有前向声明)也无法访问其成员.

    不是尽力而为,而是全力以赴.
  • 相关阅读:
    Sip协议中的严格路由和松路由
    读书有感(转)
    c# ini文件操作类(简单配置文件)
    android ApiDemos学习1 主界面动态ListView显示
    android 长度单位
    ArcGIS Engine 常用方法
    android simcard
    android 屏蔽home键操作
    android activity
    android ListView
  • 原文地址:https://www.cnblogs.com/yang666/p/7828648.html
Copyright © 2020-2023  润新知