冒个泡:最近学习了抽象类,及运算符的重载,很是费解C++的创始人是多么的牛叉
个人心得:
?=、[]、()、->以及所有的类型转换运算符只能作为成员函数重载,如果允许第一操作数不是
同类对象,而是其他数据类型,
则只能作为非成员函数重载(如输入输出流运算符>>和<<就是这样的情况)。
重载双目运算符可以用友元或者成员函数,但是两者有区别。例如用成员函数重载了 + 之后
(假设赋值运算符 = 已经被重载)
ob = ob + 100是被支持的,而ob = 100 + ob就是不被允许的。这种情况下就要使用友元函数来
对运算符重载以避免不必要的麻烦
对问题的描述如下:
定义一个抽象基类AbsCollection,含有一个对集合的基本操作,例如添加一个元素add、删除一个元素Delete、删除所有removeAll、枚举enumerate、获得元素个数getCount、判断是否包含某个元素containsMember和两个集合是否相等isEqual等。重载+(并集)、-(差集)、*(交集)、<<(输出)、>>(输入),这些操作多数要定义成纯虚函数。抽象类应包含一个int型数组,用来存储集合中的元素,从抽象基类派生出Set类和Bag类,并覆盖所有派生而来的纯虚成员函数。写函数使用抽象基类AbsCollection写两个集合的并交差,在主函数中生成Set类和Bag类对象测试。
程序如下:
AbsCollection.h文件
#include<iostream>
using namespace std;
#ifndef ABSCOLLECTION_H
#define ABSCOLLECTION_H
class AbsCollection
{
public:
AbsCollection();
int getcount();//返回长度
void make_count(int x);//改变长度
virtual void add(int x)=0;//纯虚函数
void enumerate();//输出集合中的元素
void Delete(int x);//删除元素
void removeall();
bool containmember(int x);//判断是否包含某个元素
bool is_equal(int *s,int l);//判断是否相等
virtual AbsCollection& operator-(AbsCollection& x)=0;
virtual AbsCollection& operator+(AbsCollection &x)=0;
virtual AbsCollection& operator*(AbsCollection& x)=0;
friend istream& operator>>(istream& in,AbsCollection& x);
friend ostream& operator<<(ostream& out,AbsCollection& x);
virtual ~AbsCollection();
int a[100];
private:
int len;
};
#endif // ABSCOLLECTION_H
/**************************************************/
#ifndef SET_H
#define SEY_H
class Set:public AbsCollection
{
public:
Set(){}
Set(int *s,int l);
void add(int x);
AbsCollection& operator-(AbsCollection& x);
AbsCollection& operator+(AbsCollection& x);//重载加号
AbsCollection& operator*(AbsCollection& x);
virtual ~Set();
};
#endif//SET_H
/*****************************************************/
#ifndef BAG_H
#define BAG_H
class Bag:public AbsCollection
{
public:
Bag (){}
Bag(int *s,int l);
void add(int x);
AbsCollection& operator*(AbsCollection& x);
AbsCollection& operator-(AbsCollection& x);
AbsCollection& operator+(AbsCollection& x);
virtual ~Bag();
};
#endif // BAG_H
AbsCollection.cpp文件
#include "AbsCollection.h"
#include<iostream>
#include<string.h>
using namespace std;
Bag current;
Set present;
//AbsCollection &present;
/***************************************************************************/
AbsCollection::AbsCollection()
{
len=0;
}
int AbsCollection::getcount()
{
return len;
}
void AbsCollection::make_count(int x)
{
len=x;
}
void AbsCollection::enumerate()
{
int i;
for(i=0;i<len;i++)
cout<<a[i]<<" ";
if(len==0) cout<<"无元素";
cout<<endl;
}
void AbsCollection::Delete(int x)
{
int i,j,f=0;
//cin>>x;
for(i=0;i<len;i++)
{
if(a[i]==x)
{
f=1;
break;
}
}
if(f==1)
{
for(j=i;j<len-1;j++)
a[j]=a[j+1];
len--;
}
else
cout<<"此元素不存在\n";
}
bool AbsCollection::containmember(int x)
{
int f=0;
//cin>>x;
for(int i=0;i<len;i++)
if(a[i]==x)
{
f=1;break;
}
if(f)
return true;
else return false;
}
void AbsCollection::removeall()
{
len=0;
}
bool AbsCollection::is_equal(int *s,int l)
{
int i,j,q[l],k=0;
if(l!=len) return false;
memset(q,0,l);
for(i=0;i<len;i++)
{
for(j=0;j<l;j++)
{
if(a[i]==s[j]&&q[j]==0)
{
k++;
q[j]=1;
}
}
}
if(k==len) return true;
else return false;
}
//AbsCollection& AbsCollection::operator-(AbsCollection& x)
//{
// AbsCollection& present=*this;
// int i,l=x.getcount();
// for(i=0;i<l;i++)
// {
// if(present.containmember(x.a[i]))
// present.Delete(x.a[i]);
// }
// return present;
//}
AbsCollection::~AbsCollection(){}
/***************************************************************************/
Set::Set(int *s,int l)//集合中没有重复元素
{
int i,j,t=0,k=getcount();
for(i=0;i<l;i++)
{
t=0;
for(j=0;j<k;j++)
{
if(s[i]==a[j])
{
t=1;
break;
}
}
if(!t)
{
a[k++]=s[i];
}
}
make_count(k);
}
void Set::add(int x)//元素不能重复
{
int i,k=getcount();
for(i=0;i<k;i++)
{
if(a[i]==x)
{
cout<<"此元素已存在"<<endl;
return ;
}
}
a[k++]=x;
make_count(k);
}
AbsCollection& Set::operator-(AbsCollection& x)
{
present=*this;
int i,l=x.getcount();
for(i=0;i<l;i++)
{
if(present.containmember(x.a[i]))
present.Delete(x.a[i]);
}
return present;
}
AbsCollection& Set::operator+(AbsCollection& x)
{
present=*this;
int k=present.getcount(),i,j,f,l=x.getcount();
for(i=0;i<l;i++)
{
f=0;
for(j=0;j<k;j++)
{
if(x.a[i]==present.a[j])
{
f=1;
break;
}
}
if(f==0)
present.a[k++]=x.a[i];
}
present.make_count(k);
return present;
}
AbsCollection& Set::operator*(AbsCollection& x)
{
present=*this;
int i,l=x.getcount(),s[100],t=0;
for(i=0;i<l;i++)
{
if(present.containmember(x.a[i]))
s[t++]=x.a[i];
}
present.removeall();
for(i=0;i<t;i++)
present.add(s[i]);
return present;
}
Set::~Set(){}
istream& operator>>(istream& in,AbsCollection& x)
{
int n,t;
cout<<"输入元素个数:";
cin>>n;
cout<<"输入元素:";
while(n--)
{
cin>>t;
x.add(t);
}
return in;
}
ostream& operator<<(ostream& out,AbsCollection& x)
{
x.enumerate();
return out;
}
/**********************************************************************************/
Bag::Bag(int *s,int l)
{
make_count(l);
int i,k=getcount();
for(i=0;i<k;i++)
a[i]=s[i];
}
void Bag::add(int x)
{
int k=getcount();
make_count(k+1);
a[k]=x;
}
AbsCollection& Bag::operator-(AbsCollection& x)
{
current=*this;
int i,l=x.getcount();
for(i=0;i<l;i++)
{
if(current.containmember(x.a[i]))
current.Delete(x.a[i]);
}
return current;
}
AbsCollection& Bag::operator+(AbsCollection& x)
{
current=*this;
int i,k=current.getcount(),l=x.getcount();
for(i=0;i<l;i++)
current.a[k++]=x.a[i];
current.make_count(k);
return current;
}
AbsCollection& Bag::operator*(AbsCollection& x)
{
current=*this;
int i,l=x.getcount(),s[100],t=0;
for(i=0;i<l;i++)
{
if(current.containmember(x.a[i]))
s[t++]=x.a[i];
}
current.removeall();
for(i=0;i<t;i++)
current.add(s[i]);
return current;
}
Bag::~Bag(){}
main.cpp文件
#include <iostream>
#include"AbsCollection.h"
using namespace std;
int main()
{
// int m[4]={1,2,3,4},n[5]={0,0,1,2,3};
// Set s1(m,4);
// Set s2(n,5);
// Bag b1(n,5);
// Bag b2(m,4);
Set s1,s2;
Bag b1,b2;
cout<<"输入集合S1:\n";
cin>>s1;
cout<<"输入集合S2:\n";
cin>>s2;
cout<<"输入包裹b1:\n";
cin>>b1;
cout<<"输入包裹b2:\n";
cin>>b2;
cout<<"输出集合S1:";
cout<<s1;
cout<<"输出集合S2:";
cout<<s2;
cout<<"输出包裹b1:";
cout<<b1;
cout<<"输出包裹b2:";
cout<<b2;
cout<<"两个集合s1,s2的交集"<<endl;
(s1+s2).enumerate();
cout<<"两个包裹b1,b2的交集"<<endl;
(b1+b2).enumerate();
cout<<"两个集合s1,s2的差集"<<endl;
(s1-s2).enumerate();
cout<<"两个包裹b1,b2的差集"<<endl;
(b1-b2).enumerate();
cout<<"两个集合S1,s2的交集"<<endl;
(s1*s2).enumerate();
cout<<"两个包裹b1,b2的交集"<<endl;
(b1*b2).enumerate();
// /***********对当前的元素的输出*********************/
// cout<<"输出当前集合s1: ";
// s1.enumerate();
// cout<<"输出当前包裹b1: ";
// b1.enumerate();
// /************添加元素********************************/
// cout<<"添加元素到集合s1:(输入元素)";
// cin>>x;
// s1.add(x);
// cout<<"输出当前集合s1: ";
// s1.enumerate();
// cout<<"添加元素到包裹b1:(输入元素)";
// cin>>x;
// b1.add(x);
// cout<<"输出当前包裹b1: ";
// b1.enumerate();
// /********************删除元素***************************/
// cout<<"删除集合s1中的元素:";
// s1.Delete();
// cout<<"输出当前集合s1: ";
// s1.enumerate();
// cout<<"删除包裹b1中的元素:";
// b1.Delete();
// cout<<"输出当前包裹b1: ";
// b1.enumerate();
// /*********************删除所有元素**************************/
// cout<<"删除集合s1的所有元素\n";
// s1.removeall();
// cout<<"输出当前集合s1: ";
// s1.enumerate();
// cout<<"删除包裹b1的所有元素\n";
// b1.removeall();
// cout<<"输出当前包裹b1: ";
// b1.enumerate();
return 0;
}