回 帖 发 新 帖 刷新版面

主题:类中运算符自定义/重载,和关于友元的问题

学校发的参考书太难看明白了~问问高手们先......[em12][em12]
这么小的问题也麻烦你们~不好意思了~谢谢拉~

今有一个链表类,有成员操作符'=',
'='在我写的Header里的声明:
friend LinkL &operator=(const LinkL &);
定义:
LinkL &LinkL::operator=(const LinkL &another)
{
    *cur_another=another.head;
    /////
}

编译时提示:
e:\microsoft visual studio\myprojects\newset(2)\newset\linklheader.h(21) : error C2801: “operator =”必须是非静态成员
LinkLDef.cpp
e:\microsoft visual studio\myprojects\newset(2)\newset\linklheader.h(21) : error C2801: “operator =”必须是非静态成员
e:\microsoft visual studio\myprojects\newset(2)\newset\linkldef.cpp(122) : error C2600: “LinkL::operator =”: 不能定义编译器生成的特殊成员函数(必须首先在类中声明)

那就是说这个操作符默认已经有定义了的?教材上说'='运算符是可以定义的哇~那么应该怎么用我自己的定义而不是编译器(visual studio2005)默认的定义?

另外~*cur_another=another.head这一句,head是我定义的LinkL类的私有成员,怎样才能在成员函数里访问同一个类另一个对象的私有成员?是不是象上面那样声明为友元就可以了的?

谢谢谢谢谢谢谢谢大家拉!

回复列表 (共13个回复)

11 楼

噢~ 太感谢了~!~
加上看了<<21天学通C++>>这本书(作者Jesse Liberty,大骗子;p 嘿嘿~)里面关于友元的部分~明白多啦~!~
我们讲师讲课好没激情~不知道其他人~反正我上课觉得没学到什么~还是得靠自己课后~```然后学校发的那本书又太难读......

所以太感谢你的耐心了~ 谢谢啊!

此帖可结.

^O^..菜鸟光荣!~ 哈

12 楼

代码中的 变量cur_another 是哪里来的 ??
LinkL&  operator=(const LinkL &another)
{
    *cur_another=another.head;
    /////
}

13 楼

[quote]
你理解得完全正确!只是~运算符是一元运算符,如果是类运算符函数不能有参数,如果为友元重载函数只能有一个参数!
我为何说你完全正确!因为赋值运算符都是二元运算符,在类中定义可有一个参数,定义为友元重载函数可以有两个参数,但它为何不能定义为类友元重载函数,楼主看的是C++之父(C++设计者)的书,我想它应该告诉你了吧!我也谈谈我的个人看法,但愿对有些朋友一些帮助:
  赋值运算符都只能定义为类运算符,虽然它是个二元运算符,但不能定义为友元运算符。假如将赋值运算符重载为Dog类的友元:
    friend Dog operator=( Dog &d1, Dog &d2)
   {
       d1.age =  d2.age;
       return d1;
    }
例如有表达式 x = y;可以正确的将y赋值给x; x,y都是Dog类的对象。
又例如有一表达式99 = y;它被解释为operator=(99, y);
C++编译器将99转换为一个Dog类的对象(隐含的临时变量),然后使形参引用对象,因此这是个正确的表达式。但按C++的规定(99=y常量怎能赋值),这样的表达式应是错误的,为了保证与C++规定的赋值语义相一致,应将赋值运算符重载为类运算符。同样,也应将+=,-=等这些赋值运算符重载为类运算符!

(附加: 我只有上班才能回答你的问题(嘘,小心boss炒我鱿鱼啊),下班后我有我的自由空间!)
[/quote]

为什么 我为复数运算 重载出现错误:
error C2801: 'operator =' must be a <Unknown> 

Complex operator=( Complex  &d1, const Complex  &d2)
   {
       d1.x =  d2.x;d1.y =  d2.y;
       return d1;
    }

劳烦您再指教下 !!

我来回复

您尚未登录,请登录后再回复。点此登录或注册