当前位置: 首页 > news >正文

C++ 利用类模板实现一个数组类封装

案例描述:

实现一个通用的数组类,要求如下:

  • 可以对内置数据类型以及自定义数据类型的数据进行存储

  • 将数组中的数据存储到堆区

  • 构造函数中可以传入数组的容量

  • 提供对应的拷贝构造函数以及operator=防止浅拷贝问题

  • 提供尾插法和尾删法对数组中的数据进行增加和删除

  • 可以通过下标的方式访问数组中的元素

  • 可以获取数组中当前元素个数和数组的容量

类中的基本方法和对外接口如下:

完整项目请参阅此连接:项目传送门

项目构建说明:

该项目在vscode上开发,在构建项目时请修改.vscode文件中的编译器和调试器路径

项目CMake文件

cmake_minimum_required(VERSION 3.10.0)
project(MyArray VERSION 0.1.0 LANGUAGES C CXX)


file(REMOVE_RECURSE "${PROJECT_BINARY_DIR}/build") # 设置构建目录

include_directories(${PROJECT_SOURCE_DIR}/headers) # 指定头文件目录
aux_source_directory(${PROJECT_SOURCE_DIR}/sources SRC_LIST) # 指定源文件目录
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) # 设置构建生成的二进制文件存储位置


add_executable(main ${SRC_LIST}) # 设置可执行的源文件




include(CTest)
enable_testing()

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

利用类模板实现一个数组类封装

MyArray.hpp

#pragma once
#include<iostream>
using namespace std;
// 模板类
template<class T>
class MyArray{
    public:
        MyArray(int capacity){
            cout << "MyArray有参构造调用" << endl;
            this->m_Capacity = capacity;
            this->m_Size = 0;
            this->pAddress = new T[this->m_Capacity];
        }
        MyArray(const MyArray& arr){
            cout << "MyArray拷贝构造调用" << endl;
            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];

            }
        }
        //这里同样防止浅拷贝
        MyArray& operator=(const MyArray& arr){
            cout << "MyArray赋值拷贝构造调用" << endl;
            //这种拷贝方式有可能之前已经有了存储,所以要清除掉之前的数据
            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;
        }
        // 实现基本的尾插法
        void Push_Back(const T & val){
            if(this->m_Size == this->m_Capacity){
                return;
            }
            this->pAddress[this->m_Size] = val;
            this->m_Size++;
        }
        // 删除尾部数据
        void Pop_Back(){
            if(this->m_Size == 0){
                return;
            }
            this->m_Size--;
        }

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

        int Get_Size(){
            return this->m_Size;
        }

        ~MyArray(){
            if(this->pAddress != NULL){
                cout << "MyArray析构调用" << endl;
                delete[] this->pAddress;
                this->pAddress = NULL;
            }
        }
    private:
        T * pAddress;
        int m_Capacity;
        int m_Size;
    
};

测试自定义数据类型和内置数据类型

 main.cpp

#include<iostream>
#include<string>
using namespace std;
#include "MyArray.hpp"




void printIntArray(MyArray <int>& arr){
    for(int i = 0; i< arr.Get_Size(); i++){
        cout << arr[i] << endl;
    }
}

//测试内置数据类型
void test1(){
    MyArray<int>arr1(5);
    for(int i = 0; i < 5; i++){
        arr1.Push_Back(i);
    }
    printIntArray(arr1);
    cout << "arr1 的容量为:" << arr1.Get_Capacity() << endl;
    cout << "arr1 的大小为:" << arr1.Get_Size() << endl; 

    MyArray<int>arr2(arr1);
    printIntArray(arr2);
    arr2.Pop_Back();
    printIntArray(arr2);
}
// 自定义数据类型
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.Get_Size(); i++){
        cout << "姓名:" << arr[i].m_Name << "年龄:" << arr[i].m_Age << endl;
    }
}
// 测试自定义数据类型
void test2(){
    MyArray<Person>arr(10);
    
    Person p1("孙悟空",999);
    Person p2("韩信",30);
    Person p3("妲己",20);
    Person p4("赵云",25);
    Person p5("安琪拉",27);

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

    printPersonArray(arr);
}

int main(){
    test1();
    test2();
}

相关文章:

  • 《数字图像处理》第三章 3.7 混合空间增强法笔记:原理、实现与Python实战
  • 【赵渝强老师】达梦数据库的物理存储结构
  • 使用Langchain4J整合springboot+流式数据响应示例
  • # Ubuntu 软件包管理:apt、snap 和 Flatpak 如何选择
  • GitHub 上的 Khoj 项目:打造你的专属 AI 第二大脑
  • MySQL 的索引类型有哪些?应该怎么选择?
  • React - LineChart组件编写(用于查看每日流水图表)
  • AI日报 - 2025年3月25日
  • 外观模式 (Facade Pattern)
  • 单片机串口打印调试信息②
  • 数据不外传!通过内网穿透实现绿联NAS远程访问的安全配置方案
  • 基于python的租房网站-房屋出租租赁系统(python+django+vue)源码+运行步骤
  • 第四天 开始Unity Shader的学习之旅之Unity中的基础光照
  • 专业级 AI 提示生成工具清单
  • 纯文本驱动的数据可视化革命——AI生成图表「图表狐」全场景深度解析
  • 深度拆解:AI Agent发展演练·数字挑战
  • 【蓝桥杯每日一题】3.20
  • AI医疗革命:英伟达GTC 2025医疗健康与生命科学会议全分析
  • “张江引擎 人形启程”,AI 机器人开启上海进化新范式
  • Jackson实现JSON数据的合并
  • 五一多城楼市火热:北京新房网签量同比翻倍,上海热门楼盘认购接连触发积分
  • 世界银行最新营商环境体检单:59个测评点,上海22项达全球最优水平
  • 五一假期,长三角铁路张家港、台州等多个车站客发量创新高
  • 《中国医药指南》就涉宫颈癌等论文出现男性病例致歉:辞退涉事编辑
  • 胖东来关闭官网内容清空?工作人员:后台维护升级
  • 最火“五一”预订!小长假前两日多地接待游客量两位数增长,出境游订单井喷