自定义动态数组类
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 }
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 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 }
目前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]; }