类模板实战项目——vector基础功能复现

类模板实战项目——vector基础功能复现

  • 项目要求:

  • 请设计一个数组模板类( Vector ),完成对int、char、float、double 以及任意的自定义类等类型元素进行管理。

    • a. 实现构造函数
    • b. 实现拷贝构造函数
    • c. 实现cout << 操作
    • d. 实现下标访问符[] 的重载操作
    • e. 实现 = 号操作符重载
  • Vector.h

    • 需要注意的是,在重载<<时,如果类模板,需要在 operator << 后面加上

      • ​ friend ostream& operator << (ostream& os, const Vector& vec);

    • #include <iostream>
      
      using namespace std;
      
      
      template <typename T>
      class Vector {
      public:
      	Vector(int size = 128);//构造函数
      	Vector(const Vector& object);//拷贝构造函数
      	~Vector();//析构函数
      
      	int getLength();//获取内部存储的元素个数
      
      	//重载下标运算符
      	T& operator[](int index);
      	//实现=操作符重载
      	Vector& operator=(const Vector& object);
      	//实现<<运算符
      	friend ostream& operator << <T>(ostream& os, const Vector& vec);
      private:
      	T* m_base;//
      	int m_len;//元素个数
      };
      
      
  • Vector.cpp

    • #include "Vector.h"
      
      using namespace std;
      
      template<typename T>
      Vector<T>::Vector(int size)
      {
      	if (size > 0) {
      		this->m_len = size;
      		this->m_base = new T[m_len];
      	}
      }
      
      template<typename T>
      Vector<T>::Vector(const Vector& object) {
      	//拷贝构造函数
      	//根据传入的对象元素个数分配空间
      	this->m_len = object.m_len;
      	this->m_base = new T[m_len];
      
      	//数据的拷贝
      	for (int i = 0; i < m_len; i++) {
      		m_base[i] = object.m_base[i];
      	}
      }
      template<typename T>
      Vector<T>::~Vector()//析构函数
      {
      	if (m_base != NULL) {
      		delete[] m_base;
      		m_base = NULL;
      		m_len = 0;
      	}
      }
      template<typename T>
      int Vector<T>::getLength()
      {
      	return m_len;
      }
      
      //重载下标运算符
      template<typename T>
      T& Vector<T>::operator[](int index) {
      	return m_base[index];//return *(m_base+index);
      }
      
      //实现=操作符重载
      template<typename T>
      Vector<T>& Vector<T>::operator=(const Vector& object) {
      	if (m_base != NULL) {
      		delete[] m_base;
      		m_base = NULL;
      		m_len = 0;
      	}
      	this->m_len = object.m_len;
      	this->m_base = new T[m_len];
      
      	//数据的拷贝
      	for (int i = 0; i < m_len; i++) {
      		m_base[i] = object.m_base[i];
      	}
      	return *this; //a3 = a2 = a1;
      }
      
      template<typename T>
      ostream& operator<< (ostream& os, const Vector<T>& vec)
      {
      	for (int i = 0; i < vec.m_len; i++) {
      		os << vec.m_base[i] << " ";//输出vec.m_base[i]换行之后 会在输出一个空格
      	}
      	os << endl;
      	return os;
      	// TODO: 在此处插入 return 语句
      }
      
  • 类模板实践测试.cpp

    • #include <iostream>
      #include <string>
      using namespace std;
      
      #include "Vector.cpp"
      class Student {
      	friend ostream& operator<<(ostream& out, const Student& object);
      public:
      	Student() {
      		age = 0;
      		name[0] = '\0';
      	}
      
      	Student(int _age, const char* _name) {
      		age = _age;
      		strcpy_s(name, 64, _name);
      	}
      
      	void print() {
      		cout << name << ", " << age << endl;
      	}
      
      	~Student() {
      
      	}
      
      private:
      	int age;
      	char name[64];
      };
      int main(void) {
      
      	Vector<int> myVector(10);
      
      	for (int i = 0; i < myVector.getLength(); i++) {
      		myVector[i] = i;
      	}
      	for (int i = 0; i < myVector.getLength(); i++) {
      		cout << myVector[i] << endl;
      	}
      	cout << "-------test---------" << endl;
      	Vector<int> myIntVector(myVector);
      	cout << "新的myIntVector中的元素如下:" << endl;
      	for (int i = 0; i < myIntVector.getLength(); i++) {
      		cout << myIntVector[i] << endl;
      	}
      	cout << "-------test---------" << endl;
      	//测试赋值运算符重载
      	cout << "测试赋值运算符重载" << endl;
      	Vector<int> myIntVector2(1);
      	myIntVector2 = myIntVector;
      	for (int i = 0; i < myIntVector2.getLength(); i++) {
      		cout << myIntVector2[i] << endl;
      	}
      	cout << "-------test---------" << endl;
      	//<<运算符
      	cout << myIntVector;
      
      	cout << "-------test---------" << endl;
      	cout << "测试类作为Vector内部元素" << endl;
      	Student s1(18, "李小花");
      	Student s2(19, "王大炮");
      
      	Vector<Student> vStudent(2);
      	vStudent[0] = s1;
      	vStudent[1] = s2;
      
      	//for (int i = 0; i < vStudent.getLength(); i++) {
      	//	vStudent[i].print();
      	//}
      
      	cout << vStudent << endl;
      	system("pause");
      
      	return 0;
      }
      
      ostream& operator<<(ostream& out, const Student& object)
      {
      	out << object.name << " ," << object.age << endl;
      	// TODO: 在此处插入 return 语句
      	return out;
      }
      
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值