qintangtao

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

#include <iostream>
using namespace std;
#include <stdlib.h>
/**
################################
定义
   相同类型的数据元素的集合。
################################
*/

/*
一维数组类的定义
*/
template<class Type>
class Array{
    Type * elements;  //数组存放空间
    int ArraySize;      //当前长度
    void getArray();  //建立数组空间

public:
    Array(int Size=4);
    Array(const Array<Type>& x);
    ~Array(){
        delete [] elements;
    }
    //数组复制
    Array<Type>& operator = (const Array<Type>& A);
    //取值
    Type& operator[](int i);
    //取数组长度
    int Length() const{
        return ArraySize;
    }
    //扩充数组
    void ReSize(int sz);
    //打印
    void Print();
};

/*
一维数组公共操作的实现
*/
template<class Type>
void Array<Type>::getArray(){
//私有函数:创建数组存储空间
    elements = new Type[ArraySize];
    if( elements==NULL ){
        ArraySize = 0;
        cerr<<"存储分配出错!!"<<endl;
        return;
    }
}

template<class Type>
void Array<Type>::Print(){
    for(int i=0; i<ArraySize; i++){
        cout<<elements[i]<<" ";
    }
    cout<<endl;
}

template<class Type>
Array<Type>::Array(int sz){
//构造函数
    if( sz<=0 ) {
        ArraySize = 0;
        cerr<<"飞鼠族大小"<<endl;
        return;
    }
    ArraySize = sz;
    getArray();
}

//复制构造函数
template<class Type>
Array<Type>::Array(const Array<Type>& x){
    int n = ArraySize = x.ArraySize;
    elements = new Type[n];
    if( elements==NULL ) {
        ArraySize = 0;
        cerr<<"存储分配出错!!"<<endl;
        return;
    }
    Type * srcptr = x.elements;
    Type * destptr = elements;
    while( n-- ) //注:++ 优先级大于 *
        *destptr++ = *srcptr++;
}

//按数组名即下标i,取数组元素的值
template<class Type>
Type& Array<Type>::operator [](int i) {
    if( i<0||i>ArraySize-1 ) {
        cerr<<"数组下标越界"<<endl;
        exit(1);
    }
    return elements[i];
}

//扩充数组
template<class Type>
void Array<Type>::ReSize(int sz) {
    if(sz>=0 && sz!=ArraySize ) {
        Type * newarray = new Type[sz];
        //创建新数组
        if( newarray==NULL ) {
            cerr<<"存储分配出错"<<endl;
            exit(1);
        }
        //按新的大小确定传送元素个数
        int n = (sz<=ArraySize)?sz:ArraySize;
        //源数组指针
        Type * srcptr = elements;
        //目标数组指针
        Type * destptr = newarray;
        //从源数组想目标数组传递
        while (n--)
            *destptr++ = *srcptr++;
        delete [] elements;
        elements = newarray;
        ArraySize = sz;    
    }
}

int test1(){
    int len = 8;
    Array<int> array(len);

    for( int i=0; i<len; i++) {
        array[i] = i;
    }
    
    Array<int> newarray = array;

    newarray.Print();
    newarray.ReSize(5);
    newarray.Print();


    return 0;
}

posted on 2012-11-29 17:01  qintangtao  阅读(185)  评论(0编辑  收藏  举报