免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: zwjzwj19891228
打印 上一主题 下一主题

[C++] 这是 友元吗 [复制链接]

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
21 [报告]
发表于 2014-02-20 14:21 |只看该作者
回复 20# 除美灭日平韩

在main函数里声明show是不会报错的(不是定义),本来把friend函数直接定义在class内就不是好的习惯,既然引出了这个问题就有这个问题的解决方案。
   

论坛徽章:
2
天秤座
日期:2014-01-15 13:50:58天秤座
日期:2014-02-19 17:09:23
22 [报告]
发表于 2014-02-20 15:13 |只看该作者
回复 21# myworkstation
  1. #include <iostream>
  2. using namespace std;
  3. class Person
  4. {
  5. public:
  6.     friend  void show()
  7.     {
  8.         cout << "hello" << endl;
  9.     }
  10. };

  11. int main()
  12. {
  13.     //Person p1;
  14.     void show();
  15.     show();
  16.     return 0;
  17. }
复制代码
这样编译会报错的。。。

   

论坛徽章:
6
技术图书徽章
日期:2013-11-13 11:11:27子鼠
日期:2014-02-20 17:54:13处女座
日期:2014-06-16 17:43:33午马
日期:2014-08-08 09:11:17未羊
日期:2014-08-10 11:57:072015年辞旧岁徽章
日期:2015-03-03 16:54:15
23 [报告]
发表于 2014-02-20 17:19 |只看该作者
本帖最后由 littledick 于 2014-02-20 17:54 编辑
除美灭日平韩 发表于 2014-02-20 15:13
回复 21# myworkstation 这样编译会报错的。。。

声明的位置错了。
  1. #include <iostream>
  2. using namespace std;

  3. #ifdef __WINDOWS__
  4. #define CUR_FUN_NAME    __FUNCTION__
  5. #else
  6. #define CUR_FUN_NAME    __PRETTY_FUNCTION__
  7. #end //__WINDOWS__

  8. class Person
  9. {
  10. public:
  11.     Person()
  12.     {
  13.         static int personSerial = 0;
  14.         m_Personid = personSerial++;
  15.     }
  16.     friend  void show();
  17.     friend  void showdefinein()
  18.     {
  19.         cout << "This is freind function[" << CUR_FUN_NAME << "]" << endl;
  20.     }
  21.     friend  void inputShow(const Person& rP);
  22. private:
  23.     INT m_Personid;
  24. };

  25. void show()
  26. {
  27.     Person p
  28.     cout << "This is friend function[" << CUR_FUN_NAME << "] output private attribute value: " << p.m_Personid << endl;
  29. }
  30. void showdefinein();
  31. void inputShow(const Person& rP)
  32. {
  33.     cout << "This is friend function[" << CUR_FUN_NAME << "] output input object private attribute value: " << rP.m_Personid << endl;
  34. }
  35. int main()
  36. {
  37.     show();
  38.     showdefinein();
  39.     Person p1;
  40.     inputShow(p1);
  41.     // The follow part would have compile error
  42.     // cout << p1.m_Personid << endl;
  43.     return 0;
  44. }
复制代码

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
24 [报告]
发表于 2014-02-20 17:40 |只看该作者
回复 22# 除美灭日平韩


    你用的什么编译器?这个和编译器有关系,在我的clang++上没有问题,在gcc 4.4.7上有问题,如果不能放到main里就放到main声明好了,一样的。

论坛徽章:
6
技术图书徽章
日期:2013-11-13 11:11:27子鼠
日期:2014-02-20 17:54:13处女座
日期:2014-06-16 17:43:33午马
日期:2014-08-08 09:11:17未羊
日期:2014-08-10 11:57:072015年辞旧岁徽章
日期:2015-03-03 16:54:15
25 [报告]
发表于 2014-02-20 18:10 |只看该作者
argument-dependent lookup是个很奇怪的东西。

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
26 [报告]
发表于 2014-02-20 19:50 |只看该作者
回复 25# littledick


   也叫作“koenig lookup”。

论坛徽章:
0
27 [报告]
发表于 2014-02-21 16:00 |只看该作者
当友元函数的首次声明和定义出现在类中,它的名称对于类外是不可见的。但是通过ADL(argument-dependent lookup)可以找到其定义。
楼主可以搜一下ADL关键字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP