CArray如何使用

CArray如何使用

    首先大家应该知道MFC为我们提供了一个极其有用的模板类库,但是很多初学者,不但对这个库不太了解,甚至就连模板的含义,都成问题,所以,在此,我先不谈具体的模板定义,只告诉大家如何简单的使用一个模板类。

    先以CArray为例,下面是我编写的一小段测试代码:

    struct Node

    {

        int index;

        char name[16];

    };

    以下是类模板实现为一个类的标准语法。其中,Node是出参,Node&是入参,其实也就是说:当你使用Add函数的时候,所传入的参数是后者,也就是Add(Node& node)这样的形式,而当你GetAt()取出一个元素的时候,返回的是一个Node结构体。

    typedef CArray<Node, Node&>     CArrNode; //实现一个以Node为元素的数组类

    //入参和出参都是一个指向Node的指针

    typedef CArray<Node*, Node*>    CArrNodePtr; //元素是Node*,一个指针

    int main()

    {

        CArrNode arrNode;

        Node node;

        node.index = 1;

        strcpy(node.name, "first");

        arrNode.Add(node); //向动态数组中添加一个元素

        size_t size = arrNode.GetSize();

        for(size_t i = 0; i < size; i++){

        //打印出来,看看是否正确

            printf("index: %d, name: %s\n", arrNode[i].index, arrNode[i].name);

        }

        CArrNodePtr arrNodePtr;

        Node* pnode = new Node; assert(pnode);

        pnode->index = 2;

      strcpy(pnode->name, "second");

        arrNodePtr.Add(pnode); //向数组中添加一个元素,这个元素是个指针,指向堆内存

        size_t nsize = arrNodePtr.GetSize();

        for(size_t j = 0; j < nsize; j++){

            printf("index: %d, name: %s\n", arrNodePtr[j]->index, arrNodePtr[j]->name);

        }

        //注意:在使用指针作为CArray元素时,必须在必要的时候释放曾经申请的内存,否则将会造成严重的内存泄露。

        for(j = 0; j < nsize; j++){

            if( arrNodePtr[j] ){

                delete arrNodePtr[j];

                arrNodePtr[j] = NULL;

            }

        }

        arrNodePtr.RemoveAll();

        return 0;

    }

这段代码,所描述的是最简单的CArray的用法,如果插入CArray中的元素不是一个C格式的结构体,或者内置类型的话,你必须要给这个元素(可能是一个类)追加必要的构造函数和析构函数。下面,我们来看另外的一个例子:

    假如,我们建立这样的一个动态数组,它会稳定良好的运行吗?CStrx是一个字符串类,它将会完成一些类似CString的功能。

    class CStrx

    {

    public:

        CStrx() :m_pdata(NULL), m_size(0) //初始化成员

    {

    }

        ~CStrx(){}

    private:

        char* m_pdata;

        size_t m_size;

    };

    typedef CArray<CStrx, CStrx&>                    CArrStrx;

    很遗憾,它无法按照你的意图去安全的工作,原因都在CArray的内部,暂时,我先不铺开,但我要说明的就是,在CArray的内部,需要调用元素的赋值构造函数,那么为什么我们刚刚在上个例子中,却没有为Node建立一个赋值构造函数呢?原因很简单,那就是,如果,你不提供赋值构造函数的话,C++编译器将会默认按位拷贝,而我们给出的是一个规则的结构体,并且不存在指针(像本例中的m_pdata,它可能指向一块动态分配的内存),所以不会出现问题,但一旦需要向本例这样需要深拷贝的话,那么CArray将会无法工作。所以,我们必须要为这个类,提供一个赋值构造函数。这个函数可以像这样:

    CStrx& operator=CStrx(const CStrx& str)

    {

        ……

        return *this;

    }

    然而,我们为什么要用指针作为元素传入CArray呢?其实,主要是为了效率的考虑,如果你传入的是一个对象,或者对象的引用,那么CArray将不得不动用你的赋值构造函数,可能会进行大规模的数据赋值,然而对于指针来说,它就相当于一个整数,效率将会显著提高,但是入CArray析构之前,你必须要对这些元素进行释放。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值