C 的CList,CPtrList,CObList,CStringList 用法之CPtrList
CList是通用型的列表類,你可以存放指定的數據類型,用法如下:
CList<CPoint, CPoint&> list;
這樣就指定了CList中存放的是CPoint類型的引用;
CPtrList,CObList,CStringList都是具體的用于某種類型的集合類型
而CPtrList存放的是void類型的指針,取出的時候必須要強制轉換;
CObList用于存放從CObject派生的數據類型的指針;
CStringList存放CString字符串類型,相當于CList<Cstring,CString>
?
?
CPtrList類支持void指針列表。CPtrList類的成員函數類似于CObList類的成員函數。由于這種類似性,可以使用CObList參考文檔作為成員函數的說明。無論在任何時候使用一個CObject指針作為函數參數或返回值,都可以將指針替換為void。例如,CObject* & CObList::Gethead() const;
可以替換成:
void * CPtrList::Gethead() const;CPtrList嵌入了IMPLEMENT_DYNAMIC宏來支持運行類型訪問和轉儲到CDumpContext對象。如果應用程序需要轉儲各個指針列表元素,則必須將轉儲環境的深度設置為1或大于1。指針列表不能為NULL。
當一個CPtrList對象被刪除時,或當其元素被刪除時,只刪除指針,而指針所引用的實體并未被刪除。#include <afxcoll.h>
CPtrList類成員
CPtrList apStr;
CString str;
一個函數負責往CPtrList里加記錄:
apStr.AddTail((LPCSTR)str);
一個函數將CPtrList里所有記錄讀出來:
POSITION pos apStr.GetHeadPosition();
while(pos != NULL)
{
????str = apStr.GetNext(pos);
????// 這里,你就可以使用str了
}
上面有一句漏了=號:
POSITION pos = apStr.GetHeadPosition();
再請問CPtrList里能存結構的指針嗎?
當然可以。
struct AAA
{
????int a;
????int b;
};
AAA * aa=new AAA;
CPtrList pList;
pList.AddTail(aa);
在使用CPtrList鏈表類時,其添加的對象常為結構體。其使用的方法一般分為三步:(1)分配空間,添加數據。
(2)初始化時,釋放空間。
(3)數據的使用。
下面舉一個具體的例子來說明:
1.定義一個結構體:
struct VocFile
{
?char vocPath[255];
?int vocId;
?char pwd[20];
};
一般為全局變量。
2.定義結構體變量和鏈表變量。
?CPtrList vocFileList;
?struct VocFile *pVocFile;
3.在使用前如果分配空間,則釋放空間
?POSITION pos=NULL;
?pos=vocFileList.GetHeadPosition();
?while(pos!=NULL)
?{
??pVocFile=(struct VocFile*)vocFileList.GetNext(pos);
??free(pVocFile);
?}
?vocFileList.RemoveAll();
4.分配空間,添加到鏈表中。
?while(!m_pRecordset->adoEOF)//遍歷所有記錄
??{
??getnotice->pVocFile=(struct VocFile *)malloc(sizeof(struct VocFile));
??memset(getnotice->pVocFile,0,sizeof(struct VocFile));
???TheValue = m_pRecordset->GetCollect("序號");//
???if(TheValue.vt!=VT_NULL)
???{
???// pVocFile
????getnotice->pVocFile->vocId= atoi((char*)_bstr_t(TheValue));
???// getnotice->vocId[i] = atoi((char*)_bstr_t(TheValue));
???}
???TheValue = m_pRecordset->GetCollect("密碼");//
???if(TheValue.vt!=VT_NULL)
???{
????strcpy(getnotice->pVocFile->pwd,(char*)_bstr_t(TheValue));
????//strcpy(getnotice->pwd ,(char*)_bstr_t(TheValue));
???}
???TheValue = m_pRecordset->GetCollect("語音路徑");//
???if(TheValue.vt!=VT_NULL)
???{
????strcpy(getnotice->pVocFile->vocPath,(char*)_bstr_t(TheValue));
???// strcpy(getnotice->vocFile[i] ,(char*)_bstr_t(TheValue));
???// AfxMessageBox(getnotice->vocFile[i]);
???}
???getnotice->vocFileList.AddTail(getnotice->pVocFile);
???m_pRecordset->MoveNext();
??}
5.數據的使用
?POSITION pos=NULL;??
?pos=getnotice.vocFileList.GetHeadPosition();?
while(pos!=NULL)
?{
????????getnotice.pVocFile=(struct VocFile *)getnotice.vocFileList.GetNext(pos);
????????SsmStopPlayFile(line_id);
????????SsmAddToFileList(line_id,"C:\\VOICE\\notice_split.wav",7,0,-1);
????????SsmAddToFileList(line_id,getnotice.pVocFile->vocPath,7,0,-1);//這一行有用的行
?????str.Format("update 自動通知表 set 通知狀態=1,實際通知時間='%s' where 序號=%d",time_str,getnotice.pVocFile->vocId);
????????//log->AppendLog(str);
????????db->
總結
以上是生活随笔為你收集整理的C 的CList,CPtrList,CObList,CStringList 用法之CPtrList的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于 AfxSocketInit() 的
- 下一篇: 使用CArchive类进行序列化