自定义动态数组类

BCB自带有动态数组,自定义是为了多一个选择,为某些方便,参考BCB的,目前还很弱,主要针对音频,视频字节缓冲区。

 1 void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
 2 {
 3     DynamicArray <BYTE> ByteBuf;
 4 
 5     ByteBuf.Length = 10;//设置长度
 6     ByteBuf.Length = 5;//改变长度
 7 
 8     StaticText1->Caption = IntToStr(ByteBuf.Length);//长度显示
 9 
10     ByteBuf[2] = 6;//数组赋值
11     StaticText2->Caption = IntToStr(ByteBuf[2]);//数值显示
12 
13     ByteBuf.Length = 0;//删除
14     ByteBuf.Length = 0;//再删除测试
15 }
BCB自带的动态数组
 1 class TArray
 2 {
 3    public:
 4 
 5       __fastcall TArray(void);//创建
 6       __fastcall ~TArray(void);//销毁
 7 
 8       BYTE *Data;//动态数组数据指针,Arr.Data[x]
 9 
10       DWORD Ptr;//数组指针,Arr.Ptr
11 
12       BYTE operator [] (DWORD dwInPtr);//[] 操作,返回数组数据: var = Arr[x];
13       void operator = (BYTE byInData); // = 操作,数组赋值(当前默认数组指针) Arr = var;
14 
15       __property DWORD Length = {read = dwFLength, write = FSetLength};//长度属性
16 
17       void __fastcall Del(void);//删除
18       
19    private:
20 
21       DWORD dwFLength;
22 
23       void __fastcall FSetLength(DWORD dwLen);//创建动态数组
24 };
头文件自定义类
 1 //---------------------------------------------------------------------------
 2 
 3 __fastcall TArray::TArray(void)//创建
 4 {
 5    Data = 0;//初始动态数组数据指针
 6    Ptr = 0;//初始数组指针
 7 }
 8 
 9 __fastcall TArray::~TArray(void)//销毁
10 {
11   if(Data != 0)
12     {
13        delete [] Data;
14        Data = 0;
15     }
16 }
17 //---------------------------------------------------------------------------
18 
19 void __fastcall TArray::Del(void)//删除
20 {
21   if(Data != 0)
22     {
23        delete [] Data;
24        Data = 0;
25     }
26 }
27 
28 void __fastcall TArray::FSetLength(DWORD dwLen)//创建动态数组
29 {
30    Del();//先删除,释放
31    if(dwLen == 0) return;//长度为0退出
32    dwFLength = dwLen;//存储长度
33    Data = new BYTE[dwLen];//创建
34 }
35 
36 BYTE TArray::operator [] (DWORD dwInPtr)//[] 操作,返回数组数据: var = Arr[x];
37 {
38    return Data[dwInPtr];
39 }
40 
41 void TArray::operator = (BYTE byInData)// = 操作,数组赋值(当前默认数组指针) Arr = var;
42 {
43    Data[Ptr] = byInData;
44 }
45 
46 //---------------------------------------------------------------------------
自定义类实现部分
 1 void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
 2 {
 3    TArray Arr;
 4 
 5    Arr.Length = 10;//设置长度
 6    Arr.Length = 8;//改变长度
 7    StaticText1->Caption = IntToStr(Arr.Length);//长度显示
 8 
 9    Arr.Ptr = 2;//设置数组指针
10    Arr = 3;//数组赋值
11    StaticText2->Caption = IntToStr(Arr[2]);//数值显示
12 
13    Arr.Length = 0;//删除
14    Arr.Del();//再删除测试
15 }
测试1
 1 void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
 2 {
 3    TArray Arr;
 4 
 5    Arr.Length = 10;//设置长度
 6    Arr.Length = 8;//改变长度
 7    StaticText1->Caption = IntToStr(Arr.Length);//长度显示
 8 
 9    Arr.Data[3] = 1;//成员数组方式
10    StaticText2->Caption = IntToStr(Arr.Data[3]);//数值显示
11    *Arr.Data = 2; //指针方式
12    StaticText2->Caption = IntToStr(*Arr.Data);//数值显示
13 
14    Arr.Length = 0;//删除
15    Arr.Del();//再删除测试
16 }
测试2

目前C++不支持 operator [] = (双目)操作,不能实现 Arr[x] = Var 方式操作,有空找找其他实现方式。

注:在 C++Builder 6 调试通过。

经过一段时间试用,有些意义,通过封装C语言的动态数组,减少其维护,提高应用可靠性。遗憾的是不能完全像数组一样使用。在原来基础上,进行了些调整,以下为完整源代码。

头文件:

class CDArray
{
 public:

    __fastcall CDArray(void);//构建
    __fastcall ~CDArray(void);//释放

    BYTE *Data;//动态数组数据,Arr.Buf[i]

    BYTE __fastcall operator [] (DWORD dwInPtr);//[] 操作,返回数组数据: var = Arr[x];

    __property DWORD Length = {read = dwFLength, write = FSetLength};//长度属性
 
 private: 

    bool bIsOpen;
    DWORD dwFLength;//数组长度

    void __fastcall FSetLength(DWORD dwLength);//创建动态数组
    void __fastcall DelArray(void);//删除动态数组
};

实现部分:

__fastcall CDArray::CDArray(void)//构建
{
   Data = 0;
   bIsOpen = false;
}

__fastcall CDArray::~CDArray(void)//销毁
{
   DelArray();//删除动态数组
}

void __fastcall CDArray::DelArray(void)//删除动态数组
{
   if(bIsOpen)
     {
        delete [] Data;
        Data = 0;
        bIsOpen = false;
     }
}

void __fastcall CDArray::FSetLength(DWORD dwLength)//创建动态数组属性
{
   DelArray();//先删除动态数组
   if(dwLength == 0) return;//如果设置长度为0则退出
   dwFLength = dwLength;//保存设置长度给长度属性
   Data = new BYTE[dwLength];//创建
   bIsOpen = true;
}

BYTE __fastcall CDArray::operator [] (DWORD dwInPtr)//[] 操作,返回数组数据: var = Arr[x];
{
   return Data[dwInPtr];
}

 

posted @ 2017-02-10 18:57  hbg200  阅读(443)  评论(0编辑  收藏  举报