第19课 - 数组类的创建(上)

原创 2018年04月16日 21:37:09

1、数组类的创建

        课程目标 

            -完成Array类的具体实现 

            -完成StaticArray类的具体实现 

   


        需求分析 

            -创建数组类代替原生数组的使用 

                        数组类包含长度信息 

                        数组类能够主动发现越界访问 


        Array设计要点 

                -抽象类模板,存储空间的位置和大小由子类完成 

                -重载数组操作符,判断访问下标是否台法 

                -提供数组长度的抽象访问函数 

                -提供数组对象间的复制操作


         Array类的声明 

    


2、编程实验 

数组抽象类实现     Array.h 

  1. #ifndef ARRAY_H  
  2. #define ARRAY_H  
  3.   
  4. #include"Object.h"  
  5. #include"Exception.h"  
  6.   
  7. namespace DTLib  
  8. {  
  9.   
  10. template <typename T>  
  11. class Array : public Object  
  12. {  
  13. protected:  
  14.     T* m_array;  
  15. public:  
  16.     virtual bool set(int i,const T& e)  
  17.     {  
  18.         bool ret = (0 <= i)&&(i < length());  
  19.   
  20.         if(ret)  
  21.         {  
  22.             m_array[i] = e;  
  23.         }  
  24.   
  25.         return ret;  
  26.     }  
  27.     virtual bool get(int i,T& e) const  
  28.     {  
  29.         bool ret = (0 <= i)&&(i < length());  
  30.   
  31.         if(ret)  
  32.         {  
  33.             e = m_array[i];  
  34.         }  
  35.   
  36.         return ret;  
  37.     }  
  38.   
  39.     T& operator [] (int i)  
  40.     {  
  41.         if((0 <= i)&&(i < length()))  
  42.         {  
  43.             return m_array[i];  
  44.         }  
  45.         else  
  46.         {  
  47.             THROW_EXCEPTION(IndexOutOfBoundsExpception,"Parameter i is invalid ...");  
  48.         }  
  49.     }  
  50.     T operator [] (int i) const  
  51.     {  
  52.         return (static_cast<Array<T>&>(*this)[i]);  
  53.     }  
  54.   
  55.     virtual int length()const = 0 ;  
  56.   
  57. };  
  58.   
  59. }  
  60.   
  61.   
  62. #endif // ARRAY_H  



        StaticArray设计要点

            -类模板 

                 封装原生数组 

                使用模板参数决定数组大小 

                实现函数返回数组长度 

                拷贝构造赋值操作 


        StaticArray类的声明 

    


3、编程实验 

静态数组类的实现     StaticArray.h

  1. #ifndef STATICARRAY_H  
  2. #define STATICARRAY_H  
  3.   
  4. #include"Array.h"  
  5. namespace DTLib  
  6. {  
  7.   
  8. template <typename T,int N>  
  9. class StaticArray : public Array<T>  
  10. {  
  11. protected:  
  12.     T m_space[N];  
  13. public:  
  14.     StaticArray()  
  15.     {  
  16.         this->m_array = m_space;  
  17.     }  
  18.     StaticArray(const StaticArray<T,N>& obj)  
  19.     {  
  20.         this->m_array = m_space;  
  21.   
  22.         for(int i=0;i<N;i++)  
  23.         {  
  24.             m_space[i] = obj.m_space[i];  
  25.         }  
  26.     }  
  27.     StaticArray<T,N>& operator= (const StaticArray<T,N>& obj)  
  28.     {  
  29.         if(this != &obj)  
  30.         {  
  31.             for(int i=0;i<N;i++)  
  32.             {  
  33.                 m_space[i] = obj.m_space[i];  
  34.             }  
  35.         }  
  36.   
  37.         return *this;  
  38.     }  
  39.   
  40.     int length() const  
  41.     {  
  42.         return N;  
  43.     }  
  44. };  
  45.   
  46. }  
  47.   
  48. #endif // STATICARRAY_H  


main.cpp

  1. #include<iostream>  
  2. #include"StaticArray.h"  
  3.   
  4. using namespace std;  
  5. using namespace DTLib;  
  6.   
  7. int main()  
  8. {  
  9.     StaticArray<int,5> s1;  
  10.   
  11.     for(int i=0;i<s1.length();i++)  
  12.     {  
  13.         s1[i] = i*i;  
  14.     }  
  15.     for(int i=0;i<s1.length();i++)  
  16.     {  
  17.         cout<<s1[i]<<endl;  
  18.     }  
  19.   
  20.     StaticArray<int ,5> s2;  
  21.   
  22.     s2 = s1;  
  23.   
  24.     for(int i=0;i<s2.length();i++)  
  25.     {  
  26.         cout<<s2[i]<<endl;  
  27.     }  
  28.   
  29.     int s3[2];  
  30.   
  31.     s3[4] = 100;    //难以调试  
  32.   
  33.     s2[6] = 100;      //越界访问
  34.       
  35.   
  36.   
  37.     return 0;  
  38. }  




4、实战预告 

        To be continued ... 

        思考: 

                如何实现DynamicArray

            DynamicArrayStaticArray的差异在哪里? 

                



版权声明:该博客笔记均整理于狄泰软件,未经博主允许,禁止将笔记转载 https://blog.csdn.net/qq_39654127/article/details/79965750

学习笔记:第19课 动态联接库

  Windows API中的所有函数都包含在DLL中。其中有3个最重要的DLL,Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;User32.dll,它包含用于执行用户界面任务(...
  • Last_Impression
  • Last_Impression
  • 2008-01-20 17:31:00
  • 692

opengl 粒子系统

  • 2011年05月15日 04:00
  • 31KB
  • 下载

博览网_C++_第一周_Date类的实现

本文实现了一个date类型,原版要求如下(括号为超出要求附加): 为Date类实现如下成员: 1. 构造器,可以初始化年、月、日。(使用了模板) 2. 大于、小于、等于(> 、< 、==)操作符重载,...
  • qq_31201973
  • qq_31201973
  • 2017-04-20 02:24:41
  • 441

opengl光照之聚光灯

运行效果图 片元shader uniform vec4 U_LightPos;//光源位置 uniform vec3 U_EyePos;//眼睛的位置 uniform vec4 U_Light...
  • hb707934728
  • hb707934728
  • 2017-08-11 11:05:15
  • 212

Nehe第19课粒子系统源代码20121007

  • 2012年10月07日 22:32
  • 2.51MB
  • 下载

关于JAVA类对象数组的创建

本人近期学习JAVA,从基础看起,
  • fu755383249
  • fu755383249
  • 2014-06-30 10:10:35
  • 5036

雅悠教程之易语言第19课

  • 2010年11月04日 07:01
  • 1019KB
  • 下载

C++之创建自定义类型的数组---补充(17)《Effective C++》

C++中创建自定义类型的数组的方式有三种,我们分别进行表述:1、使用new运算符直接在堆中创建://使用A的默认构造函数,然后对其进行赋值操作 A* a=new A[size]; A* a=new A...
  • u014038273
  • u014038273
  • 2017-08-30 18:13:41
  • 555
收藏助手
不良信息举报
您举报文章:第19课 - 数组类的创建(上)
举报原因:
原因补充:

(最多只允许输入30个字)