请高手进来看看!一个蛮难的问题!-----100分

flynature 2002-03-24 11:16:56
我定义了一个类,里面的数据是一个链表。如下:
1。链表
class PolynNode
{
public:
float fc;
float fpower;
PolynNode *link;
};
2。我的累
class Polyn
{
public:
Polyn();
~Polyn(){Erase();}
bool IsEmpty() const{return first==0;}
int Length() const;
bool Find(int k, float& fc,float& fpower) const;
int Search(const float& fpower) const;
Polyn& Delete(int k, float& fc,float &fpower);
Polyn& Insert(int k,const float& fc,const float& fpower);
void Erase();
Polyn& Append(const float& fc,const float& fpower);
void Output(ostream& out) const;
void operator=(const Polyn& x);
Polyn operator+(const Polyn& x) const;


private:
PolynNode *first;
PolynNode *last;
};

其中void operator=(const Polyn& x)的定义如下:
Polyn Polyn::operator +(const Polyn& x) const
{Polyn a;
//一些其他的操作
return a;
}
编译没问题,肯定通过,但是运行就有问题了,如在a=b+c时(a,b,c都为Polyn型),因为重载的+操作中,变量在return是已经调用析构函数~Polyn()把a的数据全部delete了,所以返回后就出错了。请各位高手帮忙!!!!!!!
...全文
30 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
flynature 2002-03-25
  • 打赏
  • 举报
回复
不好意思,我找到答案了,我重载的时候只要Polyn& operator+(const Polyn& x) const;就行啦!!!!
popupmenu 2002-03-25
  • 打赏
  • 举报
回复
偶明白你是为了照顾链接了。。。嗯。。。

可是你的等号重载中要求的是一个引用。。

而你加号重载返回的是一个局部变量的值,,你说是不是会出问题哪???
flynature 2002-03-25
  • 打赏
  • 举报
回复
因为我要把两个类中链表的数据以我要求的规则组合起来,再生成一个新的Polyn变量,就相当与a=3*4+4*4这样啦.
popupmenu 2002-03-25
  • 打赏
  • 举报
回复
晕了~~~~~让偶对C++的认识越来越模糊了。。hehe。
本来就不应该返回局部变量的引用嘛。。。。

偶觉得你的函数也不要用static变量的好啊。。。
可以还是返回一个局部变量,这样在表达式计算的时候应该会生成一个临时
变量用于等号计算。。。然后等号重载的参数不要用引用(因为偶觉得对临时
变量的引用是不合理的,不知道到底如何??希望大家赐教),,这样应该可以吧???

小弟对C++的认识还很肤浅,,大家多多指教。//bow。
popupmenu 2002-03-25
  • 打赏
  • 举报
回复
如Cline(元元)举的例子。。。

偶觉得就是应该返回局部变量,,而不是static变量。

然后在等号重载的参数去掉&........
profancn 2002-03-25
  • 打赏
  • 举报
回复
是new n次,n=x.length();
profancn 2002-03-25
  • 打赏
  • 举报
回复
想想CString的加操作,它不可能利用被加的CString的字符存储空间。所以你在加的内部new一个PolynNode指针,相当于一份拷贝,因为你是连表结构,在清除的时候不会有漏掉的内存。
Cline 2002-03-25
  • 打赏
  • 举报
回复
以下是\VC98\MFC\Include\AFXWIN1.INL中源码:

_AFXWIN_INLINE CRect CRect::operator+(LPCRECT lpRect) const
{
CRect rect(this);
rect.InflateRect(lpRect);
return rect;
}
ios 2002-03-25
  • 打赏
  • 举报
回复
我觉得是这样,如果是静态局部变量的话,则是放在内存全局数据区,
函数结束时并不解析,始终驻留直到程序运行结束。因此在两个线程同时
调用operator+时,会导致Polyn对象的误用。
flynature 2002-03-25
  • 打赏
  • 举报
回复
我忘记了一点,就是在声明定义下面的函数的时候,我要定义局部变量为static, 然后再在完成入a=b+c后把a用其他方法copy掉。
Polyn Polyn::operator +(const Polyn& x) const
{static Polyn a;
a.Erase();// 把它还原成空的。
//一些其他的操作
return a;
}
这样的话还有一点问题,就是不能,用于两个线程可能同时调用operator+,这就会导致对Polyn对象的误用,所以还望大家给与完美的方法!
ios 2002-03-25
  • 打赏
  • 举报
回复
偶也有点不解,这和我的认识有点出入。
当返回一个对象时,是会生成一个临时对象,并在当前外部表达时范围内有效,然后析构。当返回一个对象的引用时,应该不会产生任何副本的,因此得到的是一个局部变量的引用,居然ok了,真是奇怪。
popupmenu 2002-03-25
  • 打赏
  • 举报
回复
哦??
偶有点不解。。。
按照你的写法,也就是说现在你返回的(Polyn&)是对一个局部变量(a)的引用
对吧??而你的等号重载函数需要的正是这样一个对变量的引用。。这样就
满足了等号重载的那个函数,,可是虽然你的局部变量a后来也没有起到作
用,那为什么就可以返回对一个局部变量的引用并且将之赋给了另一个变量那???

偶猜想可能是因为返回的时候,因为等号的需要,,函数临时再建立一个
临时变量来保存局部变量a的值,然后a就析构掉,,再依靠着临时变量的引用
等号重载就给另一个变量赋了值。。。。

所以你的程序也就ok了。。。

不知道具体是怎样的??谁来告诉偶吧。。。:)你说那??
popupmenu 2002-03-24
  • 打赏
  • 举报
回复
Polyn Polyn::operator +(const Polyn& x) const
{Polyn a;
//一些其他的操作
return a;
}

你这样重载的作用何在????

还有你返回的只是一个局部变量,,当函数返回的时候,,变量a就离开了

自己的作用域,,不出错才怪哪。

1,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧