您的位置:首页 > 其它

C 的CList,CPtrList,CObList,CStringList 用法之CPtrList

2012-09-21 16:07 459 查看


直在编程中使用stl进行编程,但是最近感觉微软提供的模版类也是很好,出错机率更低,建议在mfc的工程使用。相关介绍如下,参照msdn搞清接口即可使用

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->
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: