关于抽象类

冒个泡吐舌头:最近学习了抽象类,及运算符的重载,很是费解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;
}




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值