面向对象编程和泛型编程

2014-09-17  本文已影响458人  eesly_yuan
面向对象编程
const myClass \* operator->() const;
const myClass & operator\*() const;
bool compare(const sale_item &lhs,const sale_item &rhs)
{return lhs->book()<rhs->book()}
typedef bool (*Comp)(const sale_item &lhs,const sale)item &rhs)
std::multiset<sale_item,Comp> items(compare)

模版与泛型编程
#ifndef MYQUEUE
#define MYQUEUE
#include <iostream>
using namespace std;
//声明模板类
template<class T> class Queue;
template<class T> class Queue_item;
//声明模板成员
//template<class T> 
//ostream& operator<<(ostream &out,const Queue<T> &q);
//定义Queue_item类,该类成员都是private,故需要提供友元对其进行访问
template<class T>
class Queue_item{
    T item;
    Queue_item *next;
    Queue_item(const T &qi):item(qi),next(0){}
    friend class Queue<T>;  //queue需要访问其item和next
    //friend ostream& operator<< <T> (ostream &out,const Queue<T> &q);//进行输出操作
    //template<class Type> friend ostream& operator<<(ostream& output,const Queue<Type> &q);
    //friend ostream& operator<<<int>(ostream& output,const Queue<int> &q);
};
//定义Queue类
template<class T>
class Queue
{
    friend std::ostream& operator<<(std::ostream & out,const Queue<T> &q);
public:
    //默认构造,空队列
    Queue():head(0),tail(0){}   
    //复制构造函数
    Queue(const Queue &q):head(0),tail(0){copy_items(q);}
    //初始化构造函数
    template<class it>
    Queue(it beg,it ed):head(0),tail(0){copy_items(beg,ed);}
    //赋值操作符
    Queue& operator=(const Queue &q);
    //析构函数
    ~Queue(){destroy();}
    //功能函数
    template<class it>void assign(it beg,it ed);
    T& front(){if(head != NULL) return head->item;throw std::runtime_error("empty queue");}
    const T& front()const {if(head != NULL) return head->item;throw std::runtime_error("empty queue");}
    void push(const T &qi);
    void pop();
    bool empty(){return head == 0;}
private:
    Queue_item<T> *head;
    Queue_item<T> *tail;
    void copy_items(const Queue &q);
    template<class it> void copy_items(it,it);
    void destroy();
};
//实现push操作
template<class T> void Queue<T>::push(const T &qi)
{
    Queue_item<T> *p = new Queue_item<T>(qi);
    if (empty())    
    {
        head = tail = p;
    }
    else
    {
        tail->next = p;
        tail = p;
    }
}
//实现pop操作
template<class T> void Queue<T>::pop()
{
    if (empty()) return;
    Queue_item<T> *p = head;
    head = head->next;
    delete p;
}
//这个是用于复制构造函数,故刚刚开始队列为空,不需要考虑自身的情况
template<class T> void Queue<T>::copy_items(const Queue &q)
{
    Queue_item<T> *p = q.head;
    while(p!=NULL)
    {
        push(p->item);
        p = p->next;
    }
}
//实现清除队列元素
template<class T> void Queue<T>::destroy()
{
    while(!empty())
        pop();      
}
template<class T> template<class it> void Queue<T>::copy_items(it beg,it ed)
{
    while(beg!=ed)
        push(*beg++);
}
template<class T> template<class it> void Queue<T>::assign(it beg,it ed)
{
    destroy();
    copy_items(beg,it);
}
template<class T> Queue<T> & Queue<T>::operator=(const Queue<T> &q)
{
    if (q.head != head && q.tail!=tail)
    {
        destroy();
        copy_items(q);
    }
    return *this;
}
//针对Queue重载<<操作符,实现输出
//template<class T>
//ostream& operator<< (ostream &out,const Queue<T> &q)
//{
//  out<<"< ";
//  Queue_item<T> *it = q->head;
//  while(it!=NULL)
//  {
//      out<<it->item<<" ";
//      it = it->next;
//  }
//  out<<">"<<std::endl;
//  return out; 
//}
#endif
上一篇下一篇

猜你喜欢

热点阅读