类模板实战项目——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; }
-