博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Char*和List的封装

Posted on 2011-04-25 22:22  +石头+  阅读(697)  评论(0)    收藏  举报

游戏开发中,免不了有对char*的操作,以及对List的使用。如果不封装关于此方面的类的话,在使用的时候,将十分的不方便,比如对char*的连接,赋值等等操作。

这里是CEasyStr和CEasyList类的具体代码:

#include "EasyList.h"

CEasyNode::CEasyNode(void)

{

    pre=NULL;

    data=NULL;

    next=NULL;

}

CEasyNode::~CEasyNode(void)

{

 

}

 

 

CEasyList::CEasyList(void)

{

    mHead=new CEasyNode;

    mLast=new CEasyNode;

 

 

    mHead->next=mLast;

 

    mLast->pre=mHead;

 

    mCount=0;

 

}

 

CEasyList::~CEasyList(void)

{

}

 

int CEasyList::Add(void *p)

{

    CEasyNode *bb= new CEasyNode;

 

    bb->data=p;

 

    bb->pre=mLast->pre;

    bb->next=mLast;

    mLast->pre->next=bb;

    mLast->pre=bb;

    //mLast->pre->next=bb;

 

    return ++mCount;

}

int CEasyList::Count()

{

    return mCount;

}

CEasyNode*    CEasyList::GetNode(int index)

{

    if(index>=mCount || index<0)

    {

        return NULL;

    }

 

    CEasyNode* pNode;

    pNode=mHead;

    for(int i=0;i<=index;i++)

    {

        pNode=pNode->next;

        if(pNode==NULL || pNode==mLast)

        {

            return NULL;

        }

 

    }

    return pNode;

}

void* CEasyList::Get(int index)

{

    CEasyNode *pNode=GetNode(index);

 

    if(pNode)

    {

        return pNode->data;

    }else

    {

        return NULL;

    }

}

int CEasyList::Delete(int index)

{

    CEasyNode* pNode;

    pNode=GetNode(index);

 

    if(pNode)

    {

        pNode->pre->next=pNode->next;

 

        pNode->next->pre=pNode->pre;

 

        mCount--;

 

        delete pNode;

        pNode=NULL;

    }

 

    return mCount;

 

 

 

}

void    CEasyList::Clear()

{

    while(Delete(0));

}

////////////////////////////////////////////////////////////////////////////////////////////////

#include "EasyStr.h"

 

CEasyStr::CEasyStr(void)

{

    mRef=0;

    mData=new char[1];

    strcpy(mData,"");

    //mData="";

}

 

CEasyStr::~CEasyStr(void)

{

    if(--mRef<0)

    {

        delete []mData;

        mData=NULL;

    }

}

 

 

CEasyStr CEasyStr::GetSelf()

{

    AddRef();

    return *this;

}

void CEasyStr::AddRef()

{

    mRef++;

}

int CEasyStr::GetLen()

{

    return strlen(mData);

}

void CEasyStr::operator =(const char *Str)

{

    if(mData)

    {

        delete []mData;

        mData=NULL;

    }

    int iLength=strlen(Str);

    mData=new char[iLength+1];

    strcpy(mData,Str);

 

}

void CEasyStr::operator =(char *Str)

{

    if(mData)

    {

        delete []mData;

        mData=NULL;

    }

    int iLength=strlen(Str);

    mData=new char[iLength+1];

    strcpy(mData,Str);

 

}

void CEasyStr::operator =(int I)

{

    char* temp=new char;

    sprintf(temp,"%d",I);

    //operator =(temp);

    *this=temp;

}

void CEasyStr::operator =(float F)

{

    char* temp=new char;

    sprintf(temp,"%.3f",F);

    operator =(temp);

}

 

CEasyStr CEasyStr::operator +(const char* Str)

{

    CEasyStr str1;

    char* s=new char[GetLen()+strlen(Str)+1];

    strcpy(s,mData);

    strcat(s,Str);

    str1=s;

    return str1.GetSelf();

}

 

CEasyStr CEasyStr::operator +(char* Str)

{

    CEasyStr str1;

    char* s=new char[GetLen()+strlen(Str)+1];

    strcpy(s,mData);

    strcat(s,Str);

    str1=s;

    return str1.GetSelf();

 

 

}

 

CEasyStr CEasyStr::operator +(int I)

{

    char* s=new char;

    sprintf(s,"%d",I);

 

    return *this+s;

}

CEasyStr CEasyStr::operator +(float F)

{

    char* s=new char;

    sprintf(s,"%.3f",F);

    return *this+s;

}

CEasyStr CEasyStr::operator +(CEasyStr S)

{

    S.AddRef();

    return *this+S.GetChar();

 

}

char* CEasyStr::GetChar()

{

    return mData;

}

void CEasyStr::operator =(CEasyStr Str)

{

    *this=Str.GetChar();

 

 

}

 

int CEasyStr::FindChar(char* s)

{

    int count=0,leng=strlen(s);

 

    for(int i=0;i<GetLen()-leng+1;i++)

    {

        for(int j=0;j<leng;j++)

        {

            if(mData[i+j]!=s[j])

                break;

            else if(j==leng-1)

                return i;

        }

    }

    return -1;

}

 

 

 

CEasyStr CEasyStr::CopyFromIndex(int index,int count)

{

    CEasyStr cEs;

    cEs="";

    if (index<0 || count<0 )

    {

        return cEs.GetSelf();

    }

 

    int length=GetLen();

    if(index>=length)

    {

        return cEs.GetSelf();

    }

    int sLength;

    if(index+count>=length)

        sLength=length-index;

    else

        sLength=count;

 

    char* str=new char[sLength+1];

    for(int i=0;i<sLength;i++)

        str[i]=mData[index+i];

    str[sLength]='\0';

 

    cEs=str;

    return cEs.GetSelf();

 

}

CEasyStr CEasyStr::CutLeft(int index)

{    

    CEasyStr Str;

    Str=CopyFromIndex(0,index+1);

 

    return Str.GetSelf();

 

}

CEasyStr CEasyStr::CutRight(int index)

{

    CEasyStr Str;

    Str=CopyFromIndex(index,GetLen()-index);

 

    return Str.GetSelf();

 

}