C 的CList,CPtrList,CObList,CStringList 用法之CPtrList
CList是通用型的列表類,你可以存放指定的數(shù)據(jù)類型,用法如下:
CList<CPoint, CPoint&> list;
這樣就指定了CList中存放的是CPoint類型的引用;
CPtrList,CObList,CStringList都是具體的用于某種類型的集合類型
而CPtrList存放的是void類型的指針,取出的時(shí)候必須要強(qiáng)制轉(zhuǎn)換;
CObList用于存放從CObject派生的數(shù)據(jù)類型的指針;
CStringList存放CString字符串類型,相當(dāng)于CList<Cstring,CString>
?
?
CPtrList類支持void指針列表。CPtrList類的成員函數(shù)類似于CObList類的成員函數(shù)。由于這種類似性,可以使用CObList參考文檔作為成員函數(shù)的說明。無論在任何時(shí)候使用一個(gè)CObject指針作為函數(shù)參數(shù)或返回值,都可以將指針替換為void。例如,CObject* & CObList::Gethead() const;
可以替換成:
void * CPtrList::Gethead() const;CPtrList嵌入了IMPLEMENT_DYNAMIC宏來支持運(yùn)行類型訪問和轉(zhuǎn)儲到CDumpContext對象。如果應(yīng)用程序需要轉(zhuǎn)儲各個(gè)指針列表元素,則必須將轉(zhuǎn)儲環(huán)境的深度設(shè)置為1或大于1。指針列表不能為NULL。
當(dāng)一個(gè)CPtrList對象被刪除時(shí),或當(dāng)其元素被刪除時(shí),只刪除指針,而指針?biāo)玫膶?shí)體并未被刪除。#include <afxcoll.h>
CPtrList類成員
CPtrList apStr;
CString str;
一個(gè)函數(shù)負(fù)責(zé)往CPtrList里加記錄:
apStr.AddTail((LPCSTR)str);
一個(gè)函數(shù)將CPtrList里所有記錄讀出來:
POSITION pos apStr.GetHeadPosition();
while(pos != NULL)
{
????str = apStr.GetNext(pos);
????// 這里,你就可以使用str了
}
上面有一句漏了=號:
POSITION pos = apStr.GetHeadPosition();
再請問CPtrList里能存結(jié)構(gòu)的指針嗎?
當(dāng)然可以。
struct AAA
{
????int a;
????int b;
};
AAA * aa=new AAA;
CPtrList pList;
pList.AddTail(aa);
在使用CPtrList鏈表類時(shí),其添加的對象常為結(jié)構(gòu)體。其使用的方法一般分為三步:(1)分配空間,添加數(shù)據(jù)。
(2)初始化時(shí),釋放空間。
(3)數(shù)據(jù)的使用。
下面舉一個(gè)具體的例子來說明:
1.定義一個(gè)結(jié)構(gòu)體:
struct VocFile
{
?char vocPath[255];
?int vocId;
?char pwd[20];
};
一般為全局變量。
2.定義結(jié)構(gòu)體變量和鏈表變量。
?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.數(shù)據(jù)的使用
?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 自動(dòng)通知表 set 通知狀態(tài)=1,實(shí)際通知時(shí)間='%s' where 序號=%d",time_str,getnotice.pVocFile->vocId);
????????//log->AppendLog(str);
????????db->
總結(jié)
以上是生活随笔為你收集整理的C 的CList,CPtrList,CObList,CStringList 用法之CPtrList的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于 AfxSocketInit() 的
- 下一篇: 使用CArchive类进行序列化