CPtrList类用法

转自http://blog.csdn.net/mxling/archive/2009/10/28/4739560.aspx

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.pVMFC 的CList,CPtrList,CObList,CStringList 用法之CPtrList收藏

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);
       }

ocFile=(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);
       }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值