该程序实现一个通用的数组类
程序的功能可在程序看出
注意:作者是用clion进行编写的,故需要编写CMakeLists.txt文件
CMakeLists.txt文件内容如下:
project( class_template_case )
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_STANDARD 14)
add_executable(mian mian.cpp)p
首先建立一个MyArray.hpp文件,将数组类模板的写在这个文件里。
注意:为什么不用(c++和.h)
因为类模板中的成员函数在调用阶段才会创建,导致分文件(.cpp和.h)编写链接不到
MyArray.hpp源码如下
//
// Created by wenbo on 2020/10/28.
//
#ifndef CLASS_TEMPLATE_CASE_MYARRAY_HPP
#define CLASS_TEMPLATE_CASE_MYARRAY_HPP
#endif //CLASS_TEMPLATE_CASE_MYARRAY_HPP
#pragma once
#include <iostream>
#include <string>
using namespace std;
//定义类模板
//该类模板可以存放自己定义的数据类型
template<class T>
class MyArray
{
public:
//有参构造,初始化
MyArray(int capacity)
{
this->m_Capacity=capacity;//传入容量
this->m_Size=0;//初始化数组大小
this->PAddress= new T[this->m_Capacity];//开辟容量为m_Capacity的堆区,来存放数组
}
//利用拷贝构造和以及operator =重载 防止浅拷贝的问题
//拷贝构造
MyArray(const MyArray &arr)
{
this->m_Capacity=arr.m_Capacity;
this->m_Size=arr.m_Size;
//注意开辟新的堆区,防止浅拷贝
this->PAddress=new T[arr.m_Capacity];
//将arr中的数组内容拷贝过来
for(int i=0;i<arr.m_Size;i++)
{
this->PAddress[i]=arr.PAddress[i];
}
}
//operator = (重载)
MyArray& operator =(const MyArray &arr)//返回引用的原因是因为 可以把返回的对象作为左值,比如 a=b=c
{
//要先判断堆区是否有数据,有的话要清空
if(this->PAddress!=NULL)
{
delete [] this->PAddress;
this->PAddress=NULL;
this->m_Capacity=0;
this->m_Size=0;
}
//进行拷贝
this->m_Capacity=arr.m_Capacity;
this->m_Size=arr.m_Size;
//注意开辟新的堆区
this->PAddress=new T[arr.m_Capacity];
for(int i=0;i<this->m_Size;i++)
{
this->PAddress[i]=arr.PAddress[i];
}
return *this;//一定要返回自身,这样才可以 像a=b=c这种方式赋值;
}
//尾插法 赋值
void Push_Back(const T &val)
{
//判断容量是否等于大小
if(this->m_Capacity==this->m_Size)//如果相等,则说明容量已满
{
return;
}
this->PAddress[this->m_Size]=val;
this->m_Size++;
}
//尾删法
void Pop_Back()
{
//让用户访问不到最后一个元素,逻辑上的删除
if(this->m_Size==0)//如果size都是0,说明数组里面没有内容
{
return;
}
this->m_Size--;
}
//通过下标访问数组元素(重载运算符[]),如arr[100]要做左值,则需要加引用&
T & operator [] (int index)
{
return this->PAddress[index];
}
//返回数组容量
int getCapaticy()
{
return this->m_Capacity;
}
//返回数组大小
int getSize()
{
return this->m_Size;
}
//析构函数,释放堆区
~MyArray()
{
if(this->PAddress!=NULL)
{
delete this->PAddress;
this->PAddress=NULL;
this->m_Capacity=0;
this->m_Size=0;
}
}
//属性
private:
T* PAddress;//PAddress指向堆区开辟的数组
int m_Capacity;//数组容量
int m_Size;//数组大小
};
之后我在主函数做了两个测试test01()、test02():一个是int类型的数据,一个是自定义的一个数据类型(是一个类)
main.cpp源码如下:
//
// Created by wenbo on 2020/10/28.
//
#include "MyArray.hpp"
#include<iostream>
#include <string>
using namespace std;
//输出int数据类型
void printperson(MyArray<int> &arr)
{
for(int i=0;i<arr.getSize();i++)
{
cout<<arr[i]<<endl;
}
}
void test01()
{
MyArray<int> arr(5);
//利用尾插赋值
arr.Push_Back(1);
arr.Push_Back(2);
arr.Push_Back(3);
arr.Push_Back(4);
arr.Push_Back(5);
//打印数组
printperson(arr);
cout<<"数组容量:"<<arr.getCapaticy()<<endl;
cout<<"数组大小:"<<arr.getSize()<<endl;
}
//自定义数据类型测试MyArray 这个模板类
class Person
{
public:
Person() {
};
Person(string name,int age)
{
this->m_Name=name;
this->m_Age=age;
}
string m_Name;
int m_Age;
};
//输出Person数据类型
void printperson(MyArray<Person> &arr)
{
for(int i=0;i<arr.getSize();i++)
{
cout<<"姓名:"<<arr[i].m_Name<<"age = "<<arr[i].m_Age<<endl;
}
}
void test02()
{
MyArray<Person> arr(5);
Person p1("sun",100);
Person p2("zhu",200);
Person p3("sha",300);
Person p4("tang",400);
Person p5("bai",500);
//利用尾插赋值
arr.Push_Back(p1);
arr.Push_Back(p2);
arr.Push_Back(p3);
arr.Push_Back(p4);
arr.Push_Back(p5);
//打印数组
printperson(arr);
cout<<"数组容量:"<<arr.getCapaticy()<<endl;
cout<<"数组大小:"<<arr.getSize()<<endl;
}
int main()
{
cout<<"****************test01()*********************"<<endl;
test01();
cout<<"****************test02()*********************"<<endl;
test02();
return 0;
}
运行结果如下:
****************test01()*********************
1
2
3
4
5
数组容量:5
数组大小:5
****************test02()*********************
姓名:sunage = 100
姓名:zhuage = 200
姓名:shaage = 300
姓名:tangage = 400
姓名:baiage = 500
数组容量:5
数组大小:5