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->OperateDb(str);
}