c++ 实现一个二维数组类(萌新向)

​最近项目中遇到一个需求,编写一个一维数组模板类和二维数组模板类让公司框架支持,要求拥有静态数组的大部分功能。

可能简短的几行代码并不能看出难在哪里,但是对我来说确实是为它的设计方法苦思冥想了一两天,此外还有公司大佬的帮助,也属于本人泛型编程的开篇,因此写下此文用于纪念。

下面直接上代码(一维数组类)

//头文件<array.h>

#pragma once
#include <cstddef>
#include <stdexcept>
template<typename T,size_t N>
class Array{
    T arr[N];
    public:
    T& operator[](size_t index) {
        if(index < 0||index >= N)
            throw std::out_of_range("Array out of bounds");
        return const_cast<T&>(arr[index]);//空指针需要模板特化
    }
    const T& operator[](size_t index) const {
        if(index < 0||index >= N)
            throw std::out_of_range("Array out of bounds");
        return const_cast<T&>(arr[index]);
    }

    T* begin(){return arr;}
    int size(){return N;}
};

二维数组类

//头文件<array2D.h>

#pragma once
#include <cstddef>
#include <stdexcept>
#include "Array.h"

template<typename T,size_t N1,size_t N2>
class Matrix
{
    Array<T,N2> matrix[N1];
    protected:  
    const T* it = matrix->begin();
    public:
    Array<T,N2>& operator[](int index)
    {
        if(index >= N1 ||index <0) throw std::out_of_range("Array out of bounds");
        return const_cast<Array<T,N2>&>(matrix[index]);
    }
    T* begin()
    {
        return const_cast<T*>(it);
    }

    int size(){return sizeof(T)*N1*N2;}
    int col(){return N1;}
    int row(){return N2;}
};

这些模板类由于项目需求主要是为了供今后的开发人员使用,在一定程度上完善了一般的静态数组的部分功能,毕竟c++静态数组中越界并不会抛出异常,这个类提供了异常处理。

​此外或许重载 << 运算符等等之类的暂时还没有需求,以后或许相继会完善一些类的内容,毕竟功能随着需求增加,上述只是简单功能的实现。

主要用到的点如下

1.利用begin()返回数组的指针,使得数组可以通过解引用索引数组值。
2.重载中括号,让类可以像数组一样用[]索引。
3.利用一维数组建立二维数组,双中括号索引由两个数组配合完成


因项目需要,今后也离不开泛型编程,刚刚新手上路,技术尚且不足,若是有什么建议或者什么书推荐欢迎提出一起讨论学习。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值