我是靠谱客的博主 感动魔镜,最近开发中收集的这篇文章主要介绍模板类的重载,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

放代码:

#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类型的!=只有==可以用
  • 判断类型变量相同要用地址相同,要写地址!!不能用内容
  • 小心内存泄漏

最后

以上就是感动魔镜为你收集整理的模板类的重载的全部内容,希望文章能够帮你解决模板类的重载所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部