• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            鍵盤上的舞者

            My Email: marckywu@gmail.com
            隨筆 - 19, 文章 - 0, 評論 - 3, 引用 - 0
            數(shù)據(jù)加載中……

            安全訪問數(shù)組的指針類模板

            在用數(shù)組作為數(shù)據(jù)結(jié)構(gòu)存儲數(shù)據(jù)的時(shí)候,一不小心就訪問越界了,這類錯(cuò)誤有時(shí)候很不容易發(fā)現(xiàn)。為此自己封裝一個(gè)專門用來訪問數(shù)組元素的指針類模板。此類模板需要數(shù)組的元素類型,起始地址,大小來構(gòu)造一個(gè)安全的Ptr2T指針對象,此對象訪問數(shù)組的方法不但與普通的指針相同,同時(shí)還增加了越界的安全檢查。

            #include <iostream>
            #include 
            <stdexcept>

            using namespace std;

            template
            <typename T>
            class Ptr2T {
            public:
            //構(gòu)造函數(shù),形參為數(shù)組起始地址和大小
                Ptr2T(T *p, int size)
                    : m_p(p), m_array(p), m_size(size) { };

                Ptr2T
            & operator++();                //前綴++
                const Ptr2T operator++(int);        //后綴++

                Ptr2T
            & operator--();                //前綴--
                const Ptr2T operator--(int);        //后綴--

                Ptr2T
            & operator+=(int n);
                Ptr2T
            & operator -=(int n);
            //安全的數(shù)組元素訪問操作
                T& operator*() const;  
            private:
                T 
            *m_p;           //訪問數(shù)組的指針
                T *m_array;       //保存數(shù)組的起始地址
                int m_size;       //保存數(shù)組的大小
            };

            template
            <typename T>
            inline Ptr2T
            <T>& Ptr2T<T>::operator++()
            {
                m_p 
            += 1;
                
            return *this;
            }

            template
            <typename T>
            inline 
            const Ptr2T<T> Ptr2T<T>::operator++(int)
            {
                Ptr2T current 
            = *this;
                
            ++(*this);       //用重載的前綴++來實(shí)現(xiàn)
                
                
            return current;
            }

            template
            <typename T>
            inline Ptr2T
            <T>& Ptr2T<T>::operator--()
            {
                m_p 
            -= 1;
                
            return *this;
            }

            template
            <typename T>
            inline 
            const Ptr2T<T> Ptr2T<T>::operator--(int)
            {
                Ptr2T current 
            = *this;
                
            --(*this);       //用重載的前綴--來實(shí)現(xiàn)

                
            return current;
            }

            template
            <typename T>
            inline T
            & Ptr2T<T>::operator*() const
            {
                
            if (m_p < m_array || m_p > m_array + m_size - 1) {  //越界檢查
                    throw out_of_range("out of range");
                }

                
            return *m_p;
            }

            template
            <typename T>
            inline Ptr2T
            <T>& Ptr2T<T>::operator+=(int n)
            {
                m_p 
            += n;
                
            return *this;
            }

            template
            <typename T>
            inline Ptr2T
            <T>& Ptr2T<T>::operator-=(int n)
            {
                m_p 
            -= n;
                
            return *this;
            }

            template
            <typename T>
            Ptr2T
            <T> operator+(const Ptr2T<T> &p, const int n)
            {
                
            return Ptr2T<T>(p) += n;   //用重載的+=來實(shí)現(xiàn)
            }

            template
            <typename T>
            Ptr2T
            <T> operator+(const int n, const Ptr2T<T> &p)
            {
                
            return p + n;
            }

            template
            <typename T>
            Ptr2T
            <T> operator-(const Ptr2T<T> &p, const int n)
            {
                
            return Ptr2T<T>(p) -= n;  //用重載的-=來實(shí)現(xiàn)
            }

            //使用方法
            int main(void)
            {
                
            char a[5= {'a''b''c''d''e'};
                
            int b[5= {12345}; 

                Ptr2T
            <char> pc(a, 5);
                Ptr2T
            <int> pi(b, 5);

                cout 
            << *pc++ << endl;
                pi
            --;
                pi 
            += 2;
                cout 
            << *(pi - 1<< endl;

                
            *++pi = 100;
                cout 
            << *pi << endl;
                
                
            return 0;
            }

            posted on 2009-08-13 18:29 Marcky 閱讀(370) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            66精品综合久久久久久久| 国产福利电影一区二区三区久久久久成人精品综合 | 久久婷婷激情综合色综合俺也去 | 亚洲午夜精品久久久久久app| 伊人色综合久久天天人守人婷 | 99久久国产精品免费一区二区| 中文字幕无码精品亚洲资源网久久| 亚洲精品乱码久久久久久久久久久久 | 国产精品久久久久久久人人看 | 色狠狠久久综合网| 欧美一区二区精品久久| 久久久久亚洲AV成人网人人网站| 精品久久久久久99人妻| 久久人人爽爽爽人久久久| 99精品久久精品| 熟妇人妻久久中文字幕| 狠狠综合久久综合中文88| 久久亚洲精品成人无码网站| 97r久久精品国产99国产精| 热综合一本伊人久久精品| 久久免费精品视频| 人妻无码精品久久亚瑟影视| 狠狠精品久久久无码中文字幕| 一本色综合网久久| 久久无码人妻精品一区二区三区| 久久精品一区二区三区中文字幕 | 久久精品免费一区二区三区| 久久久久久夜精品精品免费啦| 99久久精品免费看国产一区二区三区| 999久久久无码国产精品| 天天躁日日躁狠狠久久| 97精品伊人久久久大香线蕉| 2021最新久久久视精品爱| 亚洲性久久久影院| 热综合一本伊人久久精品| 国产精品久久久久久久久久影院| 午夜视频久久久久一区| 亚洲午夜无码久久久久小说| 亚洲午夜福利精品久久| 久久久久精品国产亚洲AV无码| 77777亚洲午夜久久多人|