数组模板

Posted on 2016-06-01 12:51  洪爵士  阅读(146)  评论(0编辑  收藏  举报

MyVector.h

//模板类,不要分开多文件去写。要类的声明和类函数的实现体放在一个文件中去写。这里没有分开写
//如果要岔开写的的,需要将实现体的文件 #include进来(即实现函数的.cpp文件)。

#define  _CRT_SECURE_NO_WARNINGS 
#pragma  once
#include <iostream>
using namespace std;
//1 Myvector 能够存放 int,char, 
//2 MyVector 能够存放 Teacher对象
//函数的声明和类的
template<class T>
class MyVector
{
	friend ostream& operator<<<T>(ostream &out,MyVector &myvector);//友元函数声明
public:
	MyVector();
	MyVector(int len);
	MyVector(const MyVector &another);//拷贝构造函数
	~MyVector();
	MyVector& operator=(const MyVector &another);
	T& operator[](int index);
private:
	int len;
	T *space;
};

//函数的实现
template<typename T>
MyVector<T>::MyVector()//构造函数
{
	space=NULL;
	this->len=0;
}
template<typename T>
MyVector<T>::MyVector(int len)//构造函数
{
	space=new T[len];
	this->len=len;
}
template<typename T>
MyVector<T>::MyVector(const MyVector &another)//拷贝构造函数
{
	len=another.len;
	space=new T[len];
	for(int i=0;i<len;i++)
	{
		space[i]=another.space[i];
	}
}
template<typename T>
MyVector<T>::~MyVector()//析构函数
{
	if(space!=NULL)
	{
		delete[] space;
		space=NULL;
		len=0;
	}
}
template<typename T>
T& MyVector<T>::operator[](int index)
{
	return space[index];
}
template<typename T>
MyVector<T>& MyVector<T>::operator=(const MyVector<T> &another)
{
	//先把释放旧的内存
	if(space!=NULL)
	{
		delete[] space;
		space=NULL;
		len=0;
	}
	//跟据情况分配内存
	this->len=another.len;
	this->space=new T[len];
	//拷贝数据
	for(int i=0;i<len;i++)
	{
		this->space[i]=another.space[i];
	}
	return *this;//返回本身
}
template<typename T>
ostream& operator<<(ostream &out,MyVector<T> &myvector)
{
	for(int i=0;i<myvector.len;i++)
	{
		out<<myvector.space[i]<<" ";
	}
	return out;
}

  test_MyVector.cpp测试数组模板

#include <iostream>
using namespace std;
#include <string>
#include "MyVector.h"
class Teacher
{
	friend ostream& operator<<(ostream &out,Teacher &t)//友元函数声明
	{
		out<<"姓名:"<<t.name<<" 年龄:"<<t.age<<endl;
		return out;
	}
public:
	Teacher()
	{
		//this->name="";
		///////
		this->name=NULL;
		////////
		this->age=0;
	}
	//Teacher(string name,int age)
	Teacher(char *name,int age)
	{
		//this->name=name;
		//////////////
		this->name=new char[strlen(name)+1];
		strcpy(this->name,name);
		////////////////
		this->age=age;
	}
	Teacher(const Teacher &another)
	{
		//this->name=another.name;
		/////////////////////
		if(this->name!=NULL)
		{
			delete[] this->name;
			this->age=0;
		}
		this->name=new char[strlen(another.name)+1];
		strcpy(this->name,another.name);
		////////////////////
		this->age=another.age;
	}
	~Teacher()
	{
		//this->name="";
		//////////
		if(this->name!=NULL)
		{
			delete[] this->name;
			this->name=NULL;
		}
		this->age=0;
		////////////////
	}
	Teacher& operator=(const Teacher &another)
	{
		//this->name=another.name;
		/////////////////////////
		if(this->name!=NULL)
		{
			delete[] this->name;
			this->age=0;
		}
		this->name=new char[strlen(another.name)+1];
		strcpy(this->name,another.name);
		//////////////////////
		this->age=another.age;
		return *this;
	}
private:
	//string name;//使用string类比较简单在C++中尽可能使用string表示字符串
	char *name;//char *name就会涉及到深拷贝和浅拷贝问题
	int age;
};
int main()
{
	MyVector<int> vector_int(10);
	for(int i=0;i<10;i++)
	{
		vector_int[i]=i+1;
	}
	cout<<vector_int<<endl;
	MyVector<int> vector_intcopy;
	vector_intcopy=vector_int;
	cout<<vector_intcopy<<endl;
	MyVector<char> vector_char(5);
	for(int i=0;i<5;i++)
	{
		vector_char[i]=i+'a';
	}
	cout<<vector_char<<endl;
	Teacher t1("jueshi",23);
	Teacher t2("quanyecha",25);
	Teacher t3("honglve",28);
	MyVector<Teacher> vector_teacher(3);
	vector_teacher[0]=t1;
	vector_teacher[1]=t2;
	vector_teacher[2]=t3;
	cout<<vector_teacher<<endl;
}