读书人

类成员包含一个quot;引用quot;编译异常,怎么解

发布时间: 2012-05-20 16:03:12 作者: rapoo

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

C/C++ code
struct s{    void f(){}    virtual void g(){}    void p(){printf("%p,%p\n",&s::f,&s::g);}    int i;    int j;    int k;}obj;struct ref{    s& m_s;    ref(s& ss):m_s(ss){}};int main(void){    printf("%d\n",sizeof(ref));      return 0;}
在32位系统上打印4.所以证明了引用成员应该相当于一个指针。但是我下面的代码编译都有问题。我错在哪里呢?

把main函数改成:
C/C++ code
int main(void){    ref r(obj);    printf("%d\n",sizeof(ref));    return 0;}
编译错误:
1>my.cpp(14): warning C4512: “ref”: 未能生成赋值运算符
1> my.cpp(11) : 参见“ref”的声明

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

[解决办法]
不是warning么?
obj不是引用吧,你写的那构造函数参数需要是引用类型
[解决办法]
我运行那代码没问题 同样输出:4
[解决办法]
引用的赋初值
[解决办法]
vs6 vs2008 均为发现楼主所说的警告
另外,这个警告是说
编译器 后台生成的 ref::operator= 失败

类里有了引用成员
引用必须在有初值,且始终指向初值
如果 operator= 成功,引用不就可以改变指向了吗?
于是 编译器 无法为你生成 operator=
[解决办法]
我最不喜欢有人用struct还给这个struct定义什么构造函数,析构函数什么的,最讨厌了。把C++和C给混淆了,不得好下场。

读书人网 >C++

热点推荐