| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 614 人关注过本帖
标题:求助C++程序修改
只看楼主 加入收藏
小尘2012
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-8-26
收藏
 问题点数:0 回复次数:0 
求助C++程序修改
要求:动态数组(Dynamic Array)类的封装
CDArray.cpp如下:#include <iostream>
#include <string.h>
#include "CDArray.h"

using namespace std;

//===================实现初始化=============================
template<class DataType>
void CDArray<DataType>::Init()
{
    m_pData=NULL;
    m_nSize=0;
    m_nMax=0;
}
//==================实现缺省构造函数========================
template<class DataType>
CDArray<DataType>::CDArray()
{
    CDArray::Init();
    cout<<"创建动态数组"<<endl;
}

//==================重载构造函数========================
template<class DataType>
CDArray<DataType>::CDArray(int nSize, DataType dValue)
{
    int i;
    m_nSize=nSize;
    m_nMax=2*m_nSize;
    DataType* _m_pData=new DataType[m_nMax];
    if( m_pData == NULL )
    {
        cout<<"no enough memory!"<<endl;
        exit(1);
    }

    cout<<"创建动态数组"<<endl;
    for(i=0;i<nSize;i++)
    {
        m_pData[i]=dValue;
    }
            
}

//===============实现拷贝构造函数==========================
template<class DataType>
CDArray<DataType>::CDArray(const CDArray& array)
{
    m_nSize=array.m_nSize;
    m_nMax=2*m_nSize;
    m_pData=new DataType[m_nMax];
    memcpy(m_pData,array.m_pData,m_nSize*sizeof(DataType));

}
//==================实现释放动态内存========================
template<class DataType>
void CDArray<DataType>::Free()
{
    delete [] m_pData;
    CDArray::Init();
}
//====================实现析构函数==========================
template<class DataType>
CDArray<DataType>::~CDArray()
{
    CDArray::Free();
    cout<<"已释放动态数组"<<endl;
}

//===============用内联函数实现判断数组下标的合法性===========
template<class DataType>
int CDArray<DataType>::InvalidateIndex(int nIndex)
{
    if(nIndex<0||nIndex>=m_nSize)
    {
        cout<<"index error!"<<'\n';
        return 0;
    }
    else
        return nIndex;
}
//======================显示数组所有元素======================
template<class DataType>
void CDArray<DataType>::Print(void)
{
    int i;
    for(i=0;i<m_nSize;i++)
    {
        cout<<"m_pData["<<i<<"]="<<m_pData[i]<<endl;
    }
}

//=======================实现获取数组大小======================
template<class DataType>
int CDArray<DataType>::GetSize()
{   
    return m_nSize;
}

//========================实现重置数组大小======================
template<class DataType>
int CDArray<DataType>::SetSize(int nSize)
{
    int i;

    m_pData=(DataType*)realloc(m_pData,nSize*sizeof(DataType));
    if(nSize>m_nSize)
    {
        for(i=m_nSize;i<nSize;i++) m_pData[i]=0;
    }

    m_nSize=nSize;
    return m_nSize;
}

//====================获取某个元素=============================
template<class DataType>
double CDArray<DataType>::GetAt(int nIndex)
{
    if(nIndex<0||nIndex>=m_nSize)
    {
        cout<<"index error!"<<endl;
        return 0.0;
    }
    else
    {
        return m_pData[nIndex];
    }
}

//====================设置某个元素的值============================
template<class DataType>
int CDArray<DataType>::SetAt(int nIndex,DataType dValue)
{
    if(nIndex<0||nIndex>=m_nSize)
    {
        cout<<"index error!"<<endl;
        return 0;
    }
    else
    {
        m_pData[nIndex]=dValue;
    }
    return 1;
}

//=================追加一个新的元素到数组末尾===========================
template<class DataType>
int CDArray<DataType>::PushBack(DataType dValue)
{
    m_nSize++;

    m_pData=(DataType*)realloc(m_pData,m_nSize*sizeof(DataType));
    if(m_pData == NULL)
    {
        cout<<"空间不够,追加新元素到数组末尾失败"<<endl;
        return 0;
    }
    m_pData[m_nSize-1]=dValue;

     return 1;

}

//====================从数组中删除一个元素==========================
template<class DataType>
int CDArray<DataType>::DeleteAt(int nIndex)
{
    int i;

    if(nIndex<0||nIndex>=m_nSize)
    {
        cout<<"index error!"<<endl;
        return 0;
    }
    m_nMax=2*m_nSize;
    m_nSize--;
    DataType* _m_pData=new DataType[m_nMax];
    for(i=0;i<nIndex;i++)
    {
        _m_pData[i]=m_pData[i];
    }
    for(i=nIndex;i<m_nSize;i++)
    {
        _m_pData[i]=m_pData[i+1];
    }

    m_pData=(DataType*)realloc(m_pData,m_nSize*sizeof(DataType));
    memcpy(m_pData,_m_pData,m_nSize*sizeof(DataType));

    delete []_m_pData;

   
    return 1;

}

//====================插入一个新的元素到数组中==========================
template<class DataType>
int CDArray<DataType>::InsertAt(int nIndex,DataType dValue)
{
    int i;
    if(nIndex<0||nIndex>=m_nSize)
    {
        cout<<"index error!"<<endl;
        return 0;
    }
    m_nSize+=1;
    m_nMax=2*m_nSize;
    m_nSize++;
    DataType* _m_pData=new DataType[m_nMax];
    for(i=0;i<nIndex;i++)
    {
        _m_pData[i]=m_pData[i];
    }

    _m_pData[nIndex]=dValue;

    for(i=nIndex+1;i<m_nSize;i++)
    {
        _m_pData[i]=m_pData[i-1];
    }

    m_pData=(DataType*)realloc(m_pData,m_nSize*sizeof(DataType));
    if(m_pData == NULL)
    {
        cout<<"空间不够,增加新元素到数组失败"<<endl;
        return 0;
    }
    memcpy(m_pData,_m_pData,m_nSize*sizeof(DataType));

    delete []_m_pData;

    return 1;
}

//===================重载赋值操作符号"="=======================
template<class DataType>
CDArray& CDArray<DataType>::operator = (const CDArray &array)
{
    if(this == &array)
    {
        return *this;
    }

    m_nSize=array.m_nSize;
    m_nMax=2*m_nSize;
    DataType* _m_pData=new DataType[m_nMax];
    //DataType *_m_pData=(DataType*)malloc( m_nSize * sizeof(DataType));
    memcpy(_m_pData,array.m_pData,m_nSize*sizeof(DataType));

    delete []m_pData;
    m_pData=_m_pData;

    return *this;
}
CDArray.h如下:#include <stdio.h>
#include <stdlib.h>

#include <typeinfo.h>
#include <string.h>

template <class DataType>
class CDArray
{
private:
    DataType    *m_pData;    // 存放数组的动态内存指针
    int        m_nSize;        // 数组的元素个数
    int        m_nMax;        // 预留给动态数组的内存大小

private:
    void    Init();        // 初始化
    void    Free();        // 释放动态内存
    inline    int    InvalidateIndex(int nIndex);    // 判断下标的合法性

public:
    CDArray();            // 缺省构造函数
    CDArray(int nSize, DataType dValue = 0);    // 其他构造函数,设置一定数组大小,并设置所有元素为0;当然还可以定义其他不同参数的构造函数,以方便用户使用
    CDArray(const CDArray& array);    // 拷贝构造函数(最好为所有包含动态分配成员的类都提供拷贝构造函数)
    ~CDArray();        // 析构函数

    void        Print();                // 输出显示所有数组元素的值
    int        GetSize();            // 获取数组大小(元素个数)
    int        SetSize(int nSize);        // 重新设置数组的大小。注:若nSize小于原数组大小,可截断取前nSize个元素作为新数组的元素;若nSize大于原数组大小,新增的元素的值设置缺省值0即可

    DataType    GetAt(int nIndex);                // 获取某个元素
DataType     operator[] (int nIndex) const;     // 重载[]操作符,以便像传统数组那样通过a[k]来获取元素值
    int        SetAt(int nIndex, DataType dValue);    // 设置某个元素的值

    int        PushBack(DataType dValue);        // 追加一个新的元素到数组末尾
    int        DeleteAt(int nIndex);            // 从数组中删除一个元素
    int        InsertAt(int nIndex, DataType dValue);    // 插入一个新的元素到数组中

    CDArray     &CDArray::operator = (const CDArray& array);      // 重载赋值操作符号"="
};

//其他:
#define SAFEDELETE(p)   if(p) {delete p; p=NULL;}
#define SAFEDELETES(p)   if(p) {delete [] p; p=NULL;}


//===================实现初始化=============================
template<class DataType>
void CDArray<DataType>::Init()
{
    m_pData=NULL;
    m_nSize=0;
    m_nMax=0;
}
//==================实现缺省构造函数========================
template<class DataType>
CDArray<DataType>::CDArray()
{
    CDArray<DataType>::Init();
    cout<<"创建动态数组"<<endl;
}

//==================重载构造函数========================
template<class DataType>
CDArray<DataType>::CDArray(int nSize, DataType dValue)
{
    int i;
    m_nSize=nSize;
    m_nMax=2*m_nSize;
    DataType *_m_pData=new DataType[m_nMax];
    if( m_pData == NULL )
    {
        cout<<"no enough memory!"<<endl;
        exit(1);
    }

    cout<<"创建动态数组"<<endl;
    for(i=0;i<nSize;i++)
    {
        m_pData[i]=dValue;
    }
            
}

//===============实现拷贝构造函数==========================
template<class DataType>
CDArray<DataType>::CDArray(const CDArray& array)
{
    m_nSize=array.m_nSize;
    m_nMax=2*m_nSize;
    m_pData=new DataType[m_nMax];
    memcpy(m_pData,array.m_pData,m_nSize*sizeof(DataType));

}
//==================实现释放动态内存========================
template<class DataType>
void CDArray<DataType>::Free()
{
    delete [] m_pData;
    CDArray<DataType>::Init();
}
//====================实现析构函数==========================
template<class DataType>
CDArray<DataType>::~CDArray()
{
    CDArray<DataType>::Free();
    cout<<"已释放动态数组"<<endl;
}

//===============用内联函数实现判断数组下标的合法性===========
template<class DataType>
int CDArray<DataType>::InvalidateIndex(int nIndex)
{
    if(nIndex<0||nIndex>=m_nSize)
    {
        cout<<"index error!"<<'\n';
        return 0;
    }
    else
        return nIndex;
}
//======================显示数组所有元素======================
template<class DataType>
void CDArray<DataType>::Print(void)
{
    int i;
    for(i=0;i<m_nSize;i++)
    {
        cout<<"m_pData["<<i<<"]="<<m_pData[i]<<endl;
    }
}

//=======================实现获取数组大小======================
template<class DataType>
int CDArray<DataType>::GetSize()
{   
    return m_nSize;
}

//========================实现重置数组大小======================
template<class DataType>
int CDArray<DataType>::SetSize(int nSize)
{
    int i;

    m_pData=(DataType*)realloc(m_pData,nSize*sizeof(DataType));
    if(nSize>m_nSize)
    {
        for(i=m_nSize;i<nSize;i++) m_pData[i]=0;
    }

    m_nSize=nSize;
    return m_nSize;
}

//====================获取某个元素=============================
template<class DataType>
double CDArray<DataType>::GetAt(int nIndex)
{
    if(nIndex<0||nIndex>=m_nSize)
    {
        cout<<"index error!"<<endl;
        return 0.0;
    }
    else
    {
        return m_pData[nIndex];
    }
}

//====================设置某个元素的值============================
template<class DataType>
int CDArray<DataType>::SetAt(int nIndex,DataType dValue)
{
    if(nIndex<0||nIndex>=m_nSize)
    {
        cout<<"index error!"<<endl;
        return 0;
    }
    else
    {
        m_pData[nIndex]=dValue;
    }
    return 1;
}

//=================追加一个新的元素到数组末尾===========================
template<class DataType>
int CDArray<DataType>::PushBack(DataType dValue)
{
    m_nSize++;

    m_pData=(DataType*)realloc(m_pData,m_nSize*sizeof(DataType));
    if(m_pData == NULL)
    {
        cout<<"空间不够,追加新元素到数组末尾失败"<<endl;
        return 0;
    }
    m_pData[m_nSize-1]=dValue;

     return 1;

}

//====================从数组中删除一个元素==========================
template<class DataType>
int CDArray<DataType>::DeleteAt(int nIndex)
{
    int i;

    if(nIndex<0||nIndex>=m_nSize)
    {
        cout<<"index error!"<<endl;
        return 0;
    }
    m_nMax=2*m_nSize;
    m_nSize--;
    DataType *_m_pData=new DataType[m_nMax];
    for(i=0;i<nIndex;i++)
    {
        _m_pData[i]=m_pData[i];
    }
    for(i=nIndex;i<m_nSize;i++)
    {
        _m_pData[i]=m_pData[i+1];
    }

    m_pData=(DataType*)realloc(m_pData,m_nSize*sizeof(DataType));
    memcpy(m_pData,_m_pData,m_nSize*sizeof(DataType));

    delete []_m_pData;

   
    return 1;

}

//====================插入一个新的元素到数组中==========================
template<class DataType>
int CDArray<DataType>::InsertAt(int nIndex,DataType dValue)
{
    int i;
    if(nIndex<0||nIndex>=m_nSize)
    {
        cout<<"index error!"<<endl;
        return 0;
    }
    m_nSize+=1;
    m_nMax=2*m_nSize;
    m_nSize++;
    DataType *_m_pData=new DataType[m_nMax];
    for(i=0;i<nIndex;i++)
    {
        _m_pData[i]=m_pData[i];
    }

    _m_pData[nIndex]=dValue;

    for(i=nIndex+1;i<m_nSize;i++)
    {
        _m_pData[i]=m_pData[i-1];
    }

    m_pData=(DataType*)realloc(m_pData,m_nSize*sizeof(DataType));
    if(m_pData == NULL)
    {
        cout<<"空间不够,增加新元素到数组失败"<<endl;
        return 0;
    }
    memcpy(m_pData,_m_pData,m_nSize*sizeof(DataType));

    delete []_m_pData;

    return 1;
}

//===================重载赋值操作符号"="=======================
template<class DataType>
CDArray& CDArray<DataType>::operator = (const CDArray &array)
{
    if(this == &array)
    {
        return *this;
    }

    m_nSize=array.m_nSize;
    m_nMax=2*m_nSize;
    DataType *_m_pData=new DataType[m_nMax];
    //double *_m_pData=(double*)malloc( m_nSize * sizeof(double));
    memcpy(_m_pData,array.m_pData,m_nSize*sizeof(DataType));

    delete []m_pData;
    m_pData=_m_pData;

    return *this;
}
main如下:void main()
{
CDArray<double> a;
a.InsertAt(0, 2.1);
a.Print();

a.Pushback(3.0);
a.Pushback(3.1);
a.Pushback(3.2);
a.Print();

a.DeleteAt(0);
a.Print();
a.InsertAt(0, 4.1);
a.Print();

CDArray<double> acopy = a;  //此处用到了拷贝构造函数
acopy.Print();

CDArray<double> acopy2 (a);  //该语句等同于上面的语句,都是初始化
acopy2.Print();

CDArray<double> acopy3;
acopy3 = a;                    //此处用到了赋值操作符号"="的重载
acopy3.Print();


CDArray<int> b;
b.Pushback(21);
b.Print();
b.DeleteAt(0);
b.Print();
b.Pushback(22);
b.SetSize( 5 );
b.Print();

CDArray<char> c;
c.Pushback('a');
c.Pushback('b');
c.Pushback('c');
c.InsertAt(0, 'd');
c.Print();
}
搜索更多相关主题的帖子: void include 动态 
2012-08-26 17:00
快速回复:求助C++程序修改
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.049695 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved