概述
放代码:
#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类型的!=只有==可以用
- 判断类型变量相同要用地址相同,要写地址!!不能用内容
- 小心内存泄漏
最后
以上就是感动魔镜为你收集整理的模板类的重载的全部内容,希望文章能够帮你解决模板类的重载所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复