免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2470 | 回复: 6
打印 上一主题 下一主题

类成员包含一个"引用",编译错误,如何解决? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-16 10:34 |只看该作者 |倒序浏览
10可用积分
本帖最后由 donet8 于 2012-05-16 10:37 编辑

看过一些别人写的代码,在类的成员声明的时候,可以采用一个引用符号来替代指针,并且该引用要在构造函数的初始化列表里面赋值。如下:

  1. struct s{
  2.     void f(){}
  3.     virtual void g(){}
  4.     void p(){printf("%p,%p\n",&s::f,&s::g);}
  5.     int i;
  6.     int j;
  7.     int k;
  8. }obj;
  9. struct ref{
  10.     s& m_s;
  11.     ref(s& ss):m_s(ss){}
  12. };
  13. int main(void){
  14.     printf("%d\n",sizeof(ref));  
  15.     return 0;
  16. }
复制代码
在32位系统上打印4.所以证明了引用成员应该相当于一个指针。但是我下面的代码编译都有问题。我错在哪里呢?

把main函数改成:

  1. int main(void){
  2.     ref r(obj);
  3.     printf("%d\n",sizeof(ref));
  4.     return 0;
  5. }
复制代码
编译错误:
1>my.cpp(14): warning C4512: “ref”: 未能生成赋值运算符
1>          my.cpp(11) : 参见“ref”的声明

如果解决? 我的构造函数写的有问题还是别的地方?

最佳答案

查看完整内容

有了引用(或者const成员),赋值操作符就没意义了。声明为private(禁止编译器产生默认)且不提供实现。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2012-05-16 10:34 |只看该作者
有了引用(或者const成员),赋值操作符就没意义了。
声明为private(禁止编译器产生默认)且不提供实现。

  1. private: int operator=(ref const&);
复制代码

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
3 [报告]
发表于 2012-05-16 10:49 |只看该作者
1/
void p(){printf("%p,%p\n",&s::f,&s::g);}

it is the same of void p(){printf("%p,%p\n",[red]s::f,s::g[/red]);}
and the tag '&' in here is not means a "reference", but "get the address".

2/
you can do this:
int a;
int& refa=a;

but the following code means nothing:
int a;
int& refa;  // error!! Must  assign a value (but some compiler permit you to do this. i don't know why)
refa=a;     // It is just a assignment statment

论坛徽章:
0
4 [报告]
发表于 2012-05-16 11:14 |只看该作者
测试了一下,我这里编译通过。

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [报告]
发表于 2012-05-16 11:15 |只看该作者
警告吧,可能是
ref r(obj);
定义了,但根本没用到

论坛徽章:
0
6 [报告]
发表于 2012-05-16 18:15 |只看该作者
folklore 发表于 2012-05-16 10:49
1/

it is the same of void p(){printf("%p,%p\n",[red]s::f,s::g[/red]);}


第1条不对。不加&的话编译器认为这里是函数调用,然后又没有写括号和参数列表,直接编译错误了。

论坛徽章:
0
7 [报告]
发表于 2012-05-16 18:16 |只看该作者
OwnWaterloo 发表于 2012-05-16 15:23
有了引用(或者const成员),赋值操作符就没意义了。
声明为private(禁止编译器产生默认)且不提供实现。


你说的对! 问题解决!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP