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 <malloc.h>
#include <string.h>
#include <iostream>
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;
}