CArray和CTypedPtrList的使用初步

来源:互联网 发布:哈利波特 魔杖 知乎 编辑:程序博客网 时间:2024/06/05 03:37

方法1:使用CArray
定义:
class test : public CObject
{
public:
    CString m_strName;
    char    m_cAddress[80];
    int     m_iAge;
public:
    test();
    test& operator=( const test& cSrc);
};
test::test()  //构造函数
test& test::operator= ( const test& cSrc)  // 重载=操作
{
    m_cAddress = cSrc.m_cAddress;
    m_iAge     = cSrc.m_iAge;
    m_strName  = cSrc.m_strName;
}

使用方法:
CArray<test,test&> carr_test;
test ctest;

ctest.m_strName = "panqy";
ctest.m_cAddress = "hangzhou";
ctest.m_iAge = 25;

carr_test.Add(ctest);

说明:
class 中用来存放一行数据,一个类对象ctest一行。
carr_test除了Add还有很多方法,比如 Delete,Append,
GetCount,等等,自己去查MSDN。

//////////////////////////////////////////////////////////////////////////////////////
方法2:使用VC++自带的容器,其实上面的CArray是一个动态数组
template<class_BASE_CLASS,TYPE>
class CTypedPtrList:public BASE_CLASS
定义:
class CTest : public CObject
{
public:
    CTest();   
    CTest(CString strFileName,CString strUpdateTime = _T(""));
    virtual ~CTest();
    CString  m_strFileName;
    CString     m_strUpdateTime;
};

CTest::CTest()
{
    m_strFileName = "";
    m_strUpdateTime = "";
};

CTest(CString strFileName,CString strUpdateTime = _T(""))
{
    m_strFileName = strFileName;
    m_strUpdateTime = strUpdateTime;
}

CTypedPtrList<CObList,CTest*> m_TestList;

使用:

CTest* ctest;

CString strFileName = "E:\\test.txt";
CString strTime = "20081209100922";
ctest = new CTest(strFileName,strTime);
m_TestList.AddTail(ctest);

取数据,如果容器里有10个对象,取第5个
(CTest*)m_TestList.GetAt(m_TestList.FindIndex(4))->m_strFileName;

说明:
m_TestList是一个容器(CTypedPtrList)一个对象,继承自CObject,
里面存放的是类CTest的对象。

具体来说,一行数据一个类对象,然后循环放入容器。

关于m_TestList的操作,查CTypedPtrList就知道了。给你一个我写的
容器冒泡排序

if (!m_TestList.IsEmpty()) {

    POSITION pos;
    POSITION PosIndex1;
    POSITION PosIndex2;
    CTest* pFirst;
    CTest* pSecond;
    CTest* pTemp;
    BOOL bSwiched;

    int nCount = m_TestList.GetCount(); // 取得容器中对象的个数,相当于有几行数据

    for (int i=0; i<nCount-1; i++) {
        pos = m_TestList.GetHeadPosition();
        pFirst = m_TestList.GetNext(pos);
        bSwiched = FALSE;
        for (int j=0; j<(nCount-1-i); j++) {
            pSecond = m_TestList.GetNext(pos);
            if (IsNeedSwitch(pFirst, pSecond)) { // IsNeedSwitch是一个子函数,判断前后2个对象是否需要交换,TRUE--交换
                bSwiched = TRUE;
                PosIndex1 = m_TestList.FindIndex(j);
                pTemp = (CTest*)m_TestList.GetAt(PosIndex1);

                PosIndex2 = m_TestList.FindIndex(j+1);
                m_TestList.SetAt(PosIndex1,m_TestList.GetAt(PosIndex2));
                m_TestList.SetAt(PosIndex2,pTemp);

                pFirst = m_TestList.GetAt(m_TestList.FindIndex(j+1));
            } else {
                pFirst = pSecond;
            }
        }
        if (!bSwiched) {
            break;
        }
    }       
}
 

方法3:使用struct和链表,自己研究去

0 0