Encapsulación de matriz de casos de plantilla de clase C ++

Encapsulación de matriz de casos de plantilla de clase C ++

Recientemente, me tomé un tiempo para ver videos y libros de C ++. Hoy acabo de terminar de aprender esta parte de la plantilla de la clase, solo para resumir y analizar el caso en un video. No digas tonterías, solo empieza.

Los requisitos del programa son los siguientes:
1. Se pueden almacenar datos de tipos de datos integrados y tipos de datos personalizados.
2. Almacene los datos de la matriz en el área del montón.
3. La capacidad de la matriz se puede pasar al constructor
4. Proporcione el constructor de copia correspondiente y el operador = para evitar problemas de copia superficial.
5. Proporcione métodos de interpolación de cola y eliminación de cola para agregar y eliminar datos en la matriz.
6. Se puede acceder a los elementos de la matriz mediante subíndice.
7. Puede obtener el número actual de elementos en la matriz y la capacidad de la matriz.

1. Se analiza el diseño general del programa.
Inserte la descripción de la imagen aquí
2. Se realiza el programa.
1. Primero, escriba el programa en archivos.
Agregue el archivo de encabezado para escribir la declaración.
Inserte la descripción de la imagen aquí
Debido a que las funciones miembro de la plantilla de clase están escritas en archivos, la creación El tiempo de las funciones miembro en la plantilla de clase está en la fase de llamada, lo que conduce a la división del archivo. El enlace no está disponible al escribir, por lo que aquí para resolver este problema, la declaración y la implementación se escriben en el mismo archivo y el sufijo se cambia a **. hpp ** (hpp es un nombre de convención, no obligatorio)

2. Escriba su propia clase de matriz general en MyArray
(1) Primero escriba un programa estándar para presentar

//自己通用的数组类
#pragma once//防止头文件重复包含
#include<iostream>//标准的io流,头文件引入
using namespace std;//使用标准命名空间

(2) Escriba algunas propiedades privadas que deben mantenerse en la clase MyArray

template<class T>//因为T不识别,故加类模板T
class MyArray
{
    
    
	
private:
T*pAddress;//指针指向堆区开辟的真实数组

int m_Capacity;//数组容量

int m_Size;//数组大小

}

(3) A continuación, debe escribir algunas funciones de miembros externos

public:
	//有参构造,写参数和容量
	MyArray(int capacity)
	{
    
    
		this->m_Capacity=capacity;//通过参数传入容量
		this->m_Size=0;//初始化赋值为0
		this->pAddress=new T[this->m_Capacity];//在堆区创建数据	
	}

	//防止浅拷贝提供拷贝构造函数
	MyArray(const MyArray& arr)
	{
    
    
	//编译器提供
		this->m_Capacity=arr.m_Capacity;
		this->m_Size=arr.m_Size;
		//this->pAddress=arr.pAddress;//因为编译器这样提供,指针不能这样,会导致堆区数据重复释放

		//需要进行深拷贝
		this->pAddress=new T[arr.m_Capacity];

		//因为原先数组中有数据,需将arr中的数据都拷贝过来
		for(int i=0;i<this->m_Size;i++)
		{
    
    
			this->pAddress[i]=arr.pAddress[i];
		}
	}


	//operator= 防止浅拷贝问题故重载符号
	MyArray& operator=(const MyArray& arr)
	{
    
    
	//先判断原来堆区是否有数据,如果有先释放
		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;//最后需要将参数返回
	}



	//因为堆区创建数据,是手动开辟,手动释放故需要写一个析构函数
	//析构函数
	~MyArray()
	{
    
    
		if(this->pAddress!=NULL)
		{
    
    
			delete[]this->pAddress;
		}
	}

(4) Agregue y elimine datos en la matriz a través de la interpolación de la cola y la eliminación de la cola
(el código es el siguiente :)

//尾插法
	void Push_Back(const T & vai)
	{
    
    
	//判断容量是否等于大小,若满了的话无法插入,直接返回
		if(this->m_Capacity==this->m_Size)
		{
    
    
		return;
		}
		this->pAddress[this->m_Size]=vai;//在数组末尾插入数据
		this->m_Size++;//更新数组大小
	}

	//尾删法
	void Pop_Back()
	{
    
    
	//让用户访问不到最后一个元素,即为尾删,逻辑删除
		if(this->m_Size==0)
		{
    
    
		return;
		}
		this->m_Size--;
	}

(5) Acceda a los elementos de la matriz mediante subíndice

	T& operator[](int index)
	{
    
    
		return this->pAddress[index];
	}

(6) Devuelve la capacidad y el tamaño de la matriz

	//返回数组容量
	int getCapacity()
	{
    
    
		return this->m_Capacity;
	}

	//返回数组大小
	int getSize()
	{
    
    
		return this->m_Size;
	}

(7) Escriba una función de impresión de prueba e imprima la capacidad y el tamaño de arr1

//写一个打印函数
void printIntArray(MyArray<int>& arr)
{
    
    
	for(int i=0;i<arr.getSize();i++)
	{
    
    
	cout<<arr[i]<<endl;
	}
}


//写一个测试函数利用尾插法来测试
void test01()
{
    
    
MyArray<int>arr1(5);
for(int i=0;i<5;i++)
{
    
    
	arr1.Push_Back(i);
}
cout<<"arr的打印输出为:"<<endl;

printIntArray(arr1);

//测试一下arr的容量以及大小
cout<<"arr1的容量为:"<<arr1.getCapacity()<<endl;
cout<<"arr1的大小为:"<<arr1.getSize()<<endl;
}

(8) Utilice el método de cola de medición arr2

MyArray<int>arr2(arr1);

cout<<"arr2的打印输出为:"<<endl;

printIntArray(arr2);

//尾删
arr2.Pop_Back();
cout<<"arr2的容量为:"<<arr2.getCapacity()<<endl;
cout<<"arr2的大小为:"<<arr2.getSize()<<endl;

}

(9) El resultado de la prueba es como se muestra en la siguiente figura
Inserte la descripción de la imagen aquí
(10) Finalmente, la prueba del tipo de datos personalizados La
función de prueba es la siguiente:

//测试自定义数据类型
class Person
{
    
    
public:

	Person(){
    
    };
	Person(string name,int age)
	{
    
    
		this->m_Name=name;
		this->m_Age=age;
	}

	string m_Name;
	int m_Age;
};

void printPersonArray(MyArray<Person>& arr)
{
    
    
	for(int i=0;i<arr.getSize();i++)
	{
    
    
		cout<<"姓名:"<<arr[i].m_Name<<"年龄"<<arr[i].m_Age<<endl;
	}
}


void test02()
{
    
    
	MyArray<Person>arr(10);

	Person p1("wjx",20);
	Person p2("p",20);
	Person p3("hh",908);
	Person p4("aa",308);
	Person p5("999",999);

	//将数据插入到数组中

	arr.Push_Back(p1);
	arr.Push_Back(p2);
	arr.Push_Back(p3);
	arr.Push_Back(p4);
	arr.Push_Back(p5);

	//打印数组
	printPersonArray(arr);

	//输出容量
	cout<<"arr容量为:"<<arr.getCapacity()<<endl;
	//输出大小
	cout<<"arr大小为:"<<arr.getSize()<<endl;
}

Los resultados de la prueba se muestran en la figura: Lo
Inserte la descripción de la imagen aquí
anterior es el caso de la plantilla de clase que resumí. Este caso se siente muy bien. Vale la pena aprender la sobrecarga de parámetros, la copia profunda y la copia superficial. Primero, escribiré un caso general de la plantilla de la clase Columna, tengo tiempo para escribir otros conocimientos básicos de la plantilla recordada en las últimas dos semanas, ¡vamos!

Supongo que te gusta

Origin blog.csdn.net/qq_45252077/article/details/107858480
Recomendado
Clasificación