模板类的重载

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

放代码:

#include<iostream>
#include<cstdio>
#define USE_OS

template<class T>class ArrayList;
template<class T>std::ostream &operator<<(std::ostream &os,const ArrayList<T> &obj);

class error : public std::exception {
	private:
   		std::string msg;

	public:
    	explicit error(const char *_msg_) : msg(_msg_){	}
    	const char *toString(){
     	   return msg.c_str();
   		}
   		~error() throw() {	}
};

template <class T>
class ArrayList{
	private:
		int length;
		T *data;
	public:
		ArrayList(T *arr,int len){
			if(len<0){
				
				throw error("invalid length");
			}
			// 
			data = new T[len];
			length = len;
			for(int i=0;i<len;i++){
				data[i] = arr[i];
			}
		}
		ArrayList(int len){
			if(len<0){
				throw error("invalid length");
			}
			data = new T[len];//左闭右开 0~len-1
			length = len;
			for(int i=0;i<len;i++)
				data[i] = T();
		}
		ArrayList(const ArrayList &x){//不能删空间
			data = new T[x.length];
			length = x.length;
			for(int i=0;i<length;i++){
				data[i] = x.data[i];
			}
		}
		~ArrayList(){
			if(data) delete []data;
		}
		int size()const{
			return length;
		}
//		T &operator [](const int k){这里不可以用吗 
//			if(k>=length || k<0) {
//				error e("index out of bound");
//				throw e;
//			}
//			return data[k];
//		}
		T &operator [](const int k)const{
			if(k>=length || k<0) {
				throw error("index out of bound");
			}
			return data[k];
		}
		ArrayList operator +(const ArrayList &x)const{
			ArrayList tmp(length+x.length);
//			tmp.length = length + x.length; 
//			tmp.data = new T[tmp.length];//泄漏了吗 泄漏了吗 而且这里根本不用new两次,在构造的时候已经搞好了 
			for(int i=0;i<length;i++)
				tmp.data[i] = data[i];
			for(int i=0;i<x.length;i++)
				tmp.data[i+length] = x.data[i];
			return tmp;
		}
		ArrayList &operator =(const ArrayList &x){//operator前面没加引用??? 
			if(this == &x) return *this;
			if(data) delete []data;
			data = new T[x.length];
			length = x.length;
			for(int i=0;i<length;i++){
				data[i] = x.data[i];
			}
			return *this;//是谁写赋值没有返回
		}
		bool operator ==(ArrayList &x)const{
			if(length != x.length) return false;
			for(int i=0;i<length;i++){
				if(!(data[i] == x.data[i])) return false;//只定义了T类型的==!!! 
			}
			return true;
		}
		bool operator !=(ArrayList &x)const{
			if(*this == x) return false;//是这里x写成&x了吧!!! 
			else return true;
		}
		friend std::ostream &operator <<<>(std::ostream &os,const ArrayList<T> &x);
		void print(){
			for(int i=0;i<length - 1;i++)
				std::cout<<data[i]<<" ";
            std::cout<<data[length - 1];
		}
};

template <class T>
std::ostream &operator <<(std::ostream &os,const ArrayList<T> &x){
	for(int i=0;i<x.length;i++)
		os<<x.data[i]<<" ";
	return os;
}

Tips:

  • throw error 可以直接写简洁的写法!就像里面写的!
  • 给模板类写输出重载用友元的时候,需要在最前面先声明该类,再声明该友元函数,再定义该类,再在外面定义输出重载……具体写法看模板代码
  • 重载[]的代码……再看看吧,我也不知道要不要写两个
  • 注意没有定义T类型的!=只有==可以用
  • 判断类型变量相同要用地址相同,要写地址!!不能用内容
  • 小心内存泄漏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值