array2d模板类

#ifndef _ARRAY2D_H
#define _ARRAY2D_H

#include <xutility>

template<typename T>
class array2d
{
//    Data
protected:
    T **m_ppData;

public:
    long m_lRows, m_lCols;

//    Constructor
public:
    array2d()
    {
        Init(0, 0);
    }

    array2d(long lRows, long lCols)
    {
        Init(lRows, lCols);
    }

    array2d(array2d& other)
    {
        Init(other.GetRows(), other.GetCols());
        T **pTmp = other.GetData();
        copy(pTmp[0], pTmp[0]+m_lRows*m_lCols, m_ppData[0]);
    }
   
    array2d<T> operator= (array2d other)
    {
        Destroy();
        Init(other.GetRows(), other.GetCols());

        T **pTmp = other.GetData();
        if (m_lRows>0 && m_lCols>0)
        {
            copy(pTmp[0], pTmp[0]+m_lRows*m_lCols, m_ppData[0]);
        }

        return *this;
    }

    virtual ~array2d()
    {
        Destroy();
    }

//    Attribute
//    重载()对数组元素进行存取
    T& operator()(long lRows, long lCols)
    {
        return m_ppData[lRows][lCols];
    }

    long GetRows()
    {
        return m_lRows;
    }

    void SetRows(long lRows)
    {
        m_lRows = lRows;
    }
   
    long GetCols()
    {
        return m_lCols;
    }

    void SetCols(long lCols)
    {
        m_lCols = lCols;
    }

    void GetSize(long *plRows, long *plCols)
    {
        *plRows = m_lRows;
        *plCols = m_lCols;
    }

    void SetSize(long lRows, long lCols)
    {
        m_lRows = lRows;
        m_lCols = lCols;   
    }

    T** GetData()
    {
        return m_ppData;
    }

private:
    void Init(long lRows, long lCols)
    {
        m_lRows = lRows;
        m_lCols = lCols;
       
        if (lRows <= 0 || lCols <= 0)
        {
            m_ppData = NULL;
            return;
        }

        T *pTmp = new T[lRows*lCols];
        m_ppData = new T*[lRows];

        for (long i=0; i<lRows; ++i)
        {
            m_ppData[i] = &pTmp[i*lCols];
        }
    }

    void Destroy()
    {
        if (m_ppData)
        {
            delete []m_ppData[0];
        }
       
        delete []m_ppData;
        m_ppData = NULL;
    }
};

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值