iCAx开思工具箱

标题: ProArray 对象理解 [打印本页]

作者: Easy2009    时间: 2009-3-7 18:41
标题: ProArray 对象理解
Pro/Toolkit 中的ProArray是个基础的东西。
今天花了些时间,用C++模拟了它的实现。
验证一下对象的实现。
希望大家指点。

源码 test.cpp
#include "stdafx.h"
#include <malloc.h>
#include <stdlib.h>
#include <memory.h>

class ProArray{
public:
    ProArray();
    ~ProArray();
   
public:
    int Alloc(int n_objs,int obj_size,int rellocation_size);
    int Free();
    int MaxCountGet(int obj_size);
    int ObjectAdd(int index,int n_objects,void *pobject);
    int ObjectRemove(int index,int n_objects);
    int SizeGet();
    int SizeSet(int size);
    void * operator [](int index);
private:
    char *p;
    int count;
    int size;
    int resize;
};

void * ProArray:perator [](int index)
{
    if(index >count )
        return NULL;
    return (p+index*size);
}

ProArray:roArray()
{
    p=NULL;
    count=0;
    size=0;
    resize=0;
}

ProArray::~ProArray()
{
    Free();
}


int ProArray::Alloc(int n_objs,int obj_size,int re_size)
{
    p=(char*)realloc(p,obj_size*n_objs);
    if(!p)
        return -1;
    count=n_objs;
    size=obj_size;
    resize=re_size;
    return 0;
}

int ProArray::Free()
{
    if(p)
        free((void *)p);
    p=NULL;
    return 0;
}

int ProArray::MaxCountGet(int obj_size)
{
    return (SizeGet()/obj_size);
}

int ProArray::ObjectAdd(int index,int n_objects,void *pobject)
{
    char *start=NULL;
    char *end=NULL;
   
    start=p+index*size;
    end=start+n_objects*size;
    if(end > p+SizeGet())
        return -1;
    memcpy(start,pobject,n_objects*size);
    return 0;
}

int ProArray::ObjectRemove(int index,int n_objects)
{
    char *start=p+index*size;
    char *end=start+n_objects*size;
   
    if(end > p+SizeGet())
        return -1;
    while (start <= end)
    {
        *start='\0';
        ++start;
    }
    return 0;
}

int ProArray::SizeGet()
{
    return (size*count);
}

int ProArray::SizeSet(int size)
{
    p=(char *)realloc(p,size);
   
    if(!p)
        return -1;
    return 0;
}

int main(int argc, char* argv[])
{
    char test[6][5]={"abcd","efgh","ijkl","mnop","qr","stu"};   
    ProArray array;
    int i;
   
    array.Alloc(6,5,1);
    array.ObjectAdd(0,6,test);
   
    for(i=0;i<array.MaxCountGet(5);i++)
        printf("array[%d] is %s.\n",i,array[i]);
   
    array.ObjectRemove(3,3);
   
    for(i=0;i<array.MaxCountGet(5);i++)
        printf("array[%d] is %s.\n",i,array[i]);
   
    return 0;
}
运行结果如下:
作者: liaoshan    时间: 2009-9-6 14:14
支持一下!
作者: tjkdlt    时间: 2009-9-11 17:41
支持一下~~
作者: muzijiji    时间: 2009-11-9 16:29
楼主的代码有很大的缺陷,用户多次添加对象,删除对象都会出现错误。不过最后还是感谢楼主提供了一种思路,让我们不再局限于使用,从更高的角度思考问题。
作者: fkkvms    时间: 2009-12-11 20:46
看看看看好好學習..........................................




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3