ECC工控组态软件
www.kipway.com

国内独具动态模板的工控组态软件

主页
软件产品
ECC资源
在线文档
软件下载
联系方式
留言板
 


可串行化排序动态对象数组的VC实现

VC6.0里面的CObArray以及基于它的模板数组都支持串行化Serialize,但是遗憾的是不支持排序,本文给出一个可排序并也支持对象串行化的动态对象数组类CSorObtArray。

排序采用qsort快速排序,用一个对象CSortObject作为基类,凡是从CSortObject派生而来的类都可加入CSortObArray对象,重载CSortObject::Compare()可实现对象的快速排序,重载CSortObject::Serialize()可实现对象的串行化。CSortObject和CSortObArray的关系如同VC中CObject和CObArray的关系。

1、SortObArray.h

// SortObArray.h 带排序的对象
// 
#pragma once
class CSortObject    :    public CObject //排序对象基类
{
protected:
    DECLARE_SERIAL(CSortObject);
public:
    CSortObject();
    virtual            ~CSortObject();
    virtual void    Serialize(CArchive& ar);

    void            SetSortAsc(BOOL bAsc);//设置排序方式
    virtual        int Compare(CSortObject *pOb);//排序比较,bASC是升序
protected:
    BOOL        m_bAsc;//升序
};

typedef CSortObject *LPSORTOB;//类型定义

class CSortObArray : public CObject//排序对象动态数组
{
protected:
    DECLARE_SERIAL(CSortObArray);
public:
    CSortObArray();
    ~CSortObArray();//析构只删除空间,不删除对象

    virtual void    Serialize(CArchive& ar);//串行化,已有的对象会被删除掉

public:
    BOOL        Add(LPSORTOB pOb);//添加
    int            GetSize();//取当前对象个数
    LPSORTOB    GetAt(int nIndex);//取一个对象

    void        RemoveAll();//清除空间并重新初始化 ,不删除对象
    LPSORTOB    RemoveAt(int nIndex);//移除对象,不删除初对象,返回被移除的对象
    void        DeleteObjects();//删除所有对象
    void        Qsort(BOOL bAsc);//快速排序

protected:
    LPSORTOB    *m_ob;//对象数组
    int            m_nMaxSize;
    int            m_nSize;
    int            m_nGrown;//每次增量
    
    static int  Comp(const void *p1,const void *p2 );
    BOOL        Grown();//增长
};

class CSortTestOb : public CSortObject//排序测试对象
{
protected:
    DECLARE_SERIAL(CSortTestOb);
public:
    CSortTestOb();
    CSortTestOb(int ndata);
    
    int            m_ndata;

    virtual            ~CSortTestOb();
    virtual void    Serialize(CArchive& ar);
    virtual    int        Compare(CSortObject *pOb);//排序比较,bASC是升序
};
 

2、SortObArray.cpp

3、测试代码

void test()
{
    //测试排序对象
    CSortObArray sao;
    int i;
    CSortTestOb *pob;
    for(i=0;i<100;i++)
    {
        pob = new CSortTestOb(i);//升序加入
        sao.Add(pob);
    }
    sao.Qsort(FALSE);//降序排序

    //串行化测试
    CMemFile file;
    CArchive ar(&file, CArchive::store);//存入
    sao.Serialize(ar);
    ar.Close();

    
    file.SeekToBegin();
    CArchive arr(&file, CArchive::load);//读出
    sao.Serialize(arr);
    arr.Close();

    //查看结果
    for(i=0;i<sao.GetSize();i++)
    {
        TRACE("%d\n",((CSortTestOb *)(sao.GetAt(i)))->m_ndata);
    }

    sao.DeleteObjects();//删除对象
}

2008.10.12 蒋勇 www.kipway.com

 

Copyright By 蒋勇 2002-2008 All rights reserved
渝ICP备05009453号