ITPub博客

首页 > IT职业 > IT生活 > 习作! (转)

习作! (转)

原创 IT生活 作者:amyz 时间:2007-10-31 11:33:23 0 删除 编辑
习作! (转)[@more@]

C++这个动东东以前看了始终没有写过代码,昨天看了今天花了一天时间,调了一个小类,让大家指点指点:

/*********************** tstring.h **********************************

#ifndef TSTRING_H
#define TSTRING_H

#define NULL 0
#define TRUE 1
#define FALSE 0

typedef long BOOL;

typedef unsigned long Dword;

class TSTRING
{
public:

 TSTRING(const char * pStr = NULL);
 ~TSTRING();

 void SetNewString(const char * pStr = NULL);
 char * GetString(void);
 DWORD GetStringLen(void);

 void Print(void);
 
 /**********************************************************
 **There are some side effects in assignment(=) overloading
 ** with plus(+) overloading case(TSTRING &, TSTRING &).
 ***********************************************************/
 file://TSTRING & operator = (const char * pStr);
 
 friend TSTRING & operator + (TSTRING & oStr, const char * pStr);
 friend TSTRING & operator + (const char * pStr, TSTRING & oStr);
 friend TSTRING & operator + (TSTRING & oStr1, TSTRING & oStr2);

protected:

 BOOL bNewAlloc; // Indicate whether memory is allocated
 char * pHeader; // Indicate the first character of the string
 DWORD dLen;  // Indicate the number of characters

private:
 
 char cNull;  // Represent the string when it is null.
};

#endif

/******************* tstring.cpp **************************************

#include
#include
#include

using namespace std;

#include "tstring.h"

TSTRING :: TSTRING(const char * pStr)
{
 if (pStr == NULL) {
 dLen = 0;

  // Set pHeaer to point a null string
 cNull = 0;
 pHeader = &cNull;

 bNewAlloc = FALSE;
 }
 else {
 dLen = strlen(pStr);
 pHeader = (char *) malloc(dLen + 1);
 strcpy(pHeader, pStr);
 
 bNewAlloc = TRUE;
 }
}

TSTRING :: ~TSTRING()
{
 // If the memory used by the string is allocated originally
 // by compiler, MUST NOT free it, or cause a exception!
 if (bNewAlloc)
 free(pHeader);
 
}

void TSTRING :: SetNewString(const char * pStr)
{
 long lLen = strlen(pStr);

 // If the space is exactly enough, NO NEED to allocate memory.
 if (dLen != lLen) {
 if (bNewAlloc)
 free(pHeader);
 pHeader = (char *) malloc(lLen + 1);
 dLen = lLen;
 bNewAlloc = TRUE;
 }
 strcpy(pHeader, pStr);
}

char * TSTRING :: GetString(void)
{
 return pHeader;
}

DWORD TSTRING :: GetStringLen(void)
{
 return dLen;
}

void TSTRING :: Print(void)
{
 cout << pHeader;
}

/*
TSTRING & TSTRING :: operator = (const char * pStr)
{
 if (bNewAlloc)
 free(pHeader);
 dLen = strlen(pStr);
 pHeader = (char *) malloc(dLen + 1);
 strcpy(pHeader, pStr);
 
 return * this;
}
*/

TSTRING & operator + (TSTRING & oStr, const char * pStr)
{
 TSTRING *pNewStr = new TSTRING;
 
 long lLen;
 
 lLen = oStr.dLen + strlen(pStr);
 pNewStr->pHeader = (char *) malloc(lLen + 1);
 
 strcpy(pNewStr->pHeader, oStr.pHeader);
 strcpy(pNewStr->pHeader + oStr.dLen, pStr);
 
 pNewStr->bNewAlloc = TRUE;
 pNewStr->dLen = lLen;

 return * pNewStr;
}

TSTRING & operator + (const char * pStr, TSTRING & oStr)
{
 
 TSTRING *pNewStr = new TSTRING;
 
 long lLen;
 
 lLen = strlen(pStr);
 pNewStr->pHeader = (char *) malloc(lLen + oStr.dLen + 1);
 
 strcpy(pNewStr->pHeader, pStr);
 strcpy(pNewStr->pHeader + lLen, oStr.pHeader);
 
 pNewStr->bNewAlloc = TRUE;
 pNewStr->dLen = lLen + oStr.dLen;

 return * pNewStr;
}

TSTRING & operator + (TSTRING & oStr1, TSTRING & oStr2)
{
 
 TSTRING *pNewStr = new TSTRING;
 
 pNewStr->dLen = oStr1.dLen + oStr2.dLen;
 pNewStr->pHeader = (char *) malloc(pNewStr->dLen + 1);
 
 strcpy(pNewStr->pHeader, oStr1.pHeader);
 strcpy(pNewStr->pHeader + oStr1.dLen, oStr2.pHeader);
 
 pNewStr->bNewAlloc = TRUE;

 return * pNewStr;
}

/************************* learn.cpp (including main entry function) ************

#include "tstring.h"

int main(int argc, char * argv[])
{
 
 TSTRING str1("Original string!n");
 str1.Print();

 str1.SetNewString("New string!");
 str1.Print();

 TSTRING & str2 = str1;
 
 str2 = "pre_" + str1 + "_post!";
 str2.Print();

 return 0;
}


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752019/viewspace-979965/,如需转载,请注明出处,否则将追究法律责任。

下一篇: RAD与non-RAD (转)
请登录后发表评论 登录
全部评论
  • 博文量
    3984
  • 访问量
    7339169