关于运算符+重载的时候出现错误 5C

#include
#include
using namespace std;
// enum bool {false,true};
struct element { //定义链表中的结点结构
int val;
element next;
};
class list { //定义链表类
protected:element *elems;
public:
list() { elems = 0; }
~list();
virtual bool insert(int); //此虚函数在派生类中可重新定义
virtual bool deletes(int); //此虚函数在派生类中可重新定义
bool contain(int);
void print();
};
class set :public list { //将集合类 set 定义为链表类 list 的派生类
int Card;
public:
set() { Card = 0; }
bool insert(int); //重定义此函数
bool deletes(int); //重定义此函数
bool add(set
, set*);
bool and(set*, set*);
bool minute(set*, set*);
friend set operator +(set&, set&);
friend set operator -(set&, set&);
friend set operator (set&, set&);
};
list::~list() //list 类得析构函数定义,循环释放各元素所占的存储
{
element *tmp = elems;
for (element *elem = elems; elem != 0;)
{
tmp = elem;
elem = elem->next;
delete tmp;
}
}
bool list::insert(int val) //定义 list 类中插入元素的成员函数
{
element *elem = new element; //为新元素分配存储
if (elem != 0) {
elem->val = val; //将新元素插入到链表头
elem->next = elems;
elems = elem;
return true;
}
else return false;
}
bool list::deletes(int val) //定义 list 类中删除元素的成员函数
{
if (elems == 0) return false; //若表为空,返回 false
element *tmp = elems;
if (elems->val == val)
{ //若待删除的元素为表头元素
elems = elems->next;
delete tmp;
return true;
}
else
for (element *elem = elems; elem->next != 0; elem = elem->next)
if (elem->next->val == val)
{ //循环查找待删除元素
tmp = elem->next;
elem->next = tmp->next;
delete tmp;
return true;
}
return false;
}
bool list::contain(int val)
{ //判元素 val 在链表中是否存在,存在返回true,不存在返回false
if (elems == 0)return false;
if (elems->val == val) return true;
else
for (element *elem = elems; elem->next != 0; elem = elem->next)
if (elem->next->val == val)
return true;
return false;
}
void list::print() //输出链表中各元素
{
if (elems == 0) return;
for (element *elem = elems; elem != 0; elem = elem->next)
cout << elem->val << " ";
cout << endl;
}
bool set::insert(int val) //在 set 类中的 insert 的重定义版本
{
if (!contain(val))
{ //先判断此元素是否存在,然后再调用基类的此函数版本
++Card;
list::insert(val);
return true;
}
return false;
}
bool set::deletes(int val) //在 set 类中的 deletes 的重定义版本
{
if (list::deletes(val)) //调用基类中的此函数版本
{
return true;
}
return false;
}
bool set::add(set
s1,set* s2)
{
for (element* elem=s1->elems;elem!=NULL;elem=elem->next)
{
insert(elem->val);
}
for (element* elem = s2->elems; elem != NULL; elem = elem->next)
{
insert(elem->val);
}
return true;
}
bool set:: and (set* s1,set* s2)
{
for (element* elem=s1->elems;elem!=NULL;elem=elem->next)
{
if (s2->contain(elem->val))
{
insert(elem->val);
}
}
return true;
}
bool set::minute(set* s1,set* s2)
{
for (element* elem = s1->elems; elem!= NULL; elem = elem->next)
{
if (!s2->contain(elem->val))
{
insert(elem->val);
}
}
return true;
}

set operator +(set& s1, set& s2)
{
set s;

for (element* elem = s1.elems; elem != NULL; elem = elem->next)
{
    s.insert(elem->val);
}
for (element* elem = s2.elems; elem != NULL; elem = elem->next)
{
    s.insert(elem->val);
}
return s;

}

set operator -(set& s1, set& s2)
{
set s;
set* set1 = &s1;
set* set2 = &s2;
for (element* elem = set1->elems; elem != NULL; elem = elem->next)
{
if (!set2->contain(elem->val))
{
s.insert(elem->val);
}
}
return s;
}
set operator (set& s1, set& s2)
{
set s;
for (element
elem = s1.elems; elem != NULL; elem = elem->next)
{
if (s2.contain(elem->val))
{
s.insert(elem->val);
}
}
return s;
}

int main()
{
set *ptr, set1,set2;
ptr = &set1;
ptr->insert(15);
ptr->insert(16);
ptr->insert(17);
ptr->insert(18);
ptr->print();
ptr = &set2;
ptr->insert(20);
ptr->insert(19);
ptr->insert(17);
ptr->insert(18);
ptr->print();
set set3, set4, set5;
ptr = &set3;
set3 = (set1 + set2);
//set4 = set1 - set2;
//set5 = set1 * set2;

ptr->print();
ptr->print();
ptr->print();
return 1;

}

4个回答

函数名不能叫and,怀疑是哪个头文件定义了。
修改为and1就可以编译。 http://ideone.com/VJ0eWX

图片说明
图片说明
你得重载运算符=
因为set3 = (set1 + set2)时,只把(set1+set2)结果的成员函数elems赋值给了set3,也就是只把链表的第一个结点的地址赋值给了set3中链表的第一个结点指针。
而链表中其他的哪些结点给释放掉了,所以会是随机值。
重载运算符等号=之后就可以了,参考这两张图片。

成员变量elems,建议:类成员对象赋值时,如果对象中有指针成员,要么写一个拷贝构造函数,要么重载运算符等号=

重载运算符=时只能是成员变量的形式,不能是友元函数的形式。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐