/*
一个模拟CString和AnsiString的类,实现一部分常用的功能。
支持vc++6.0和c++builder6.0,
测试环境:windows xp+vc6
如发现有任何bug,请解决后告诉我哦,wacr@gmail.com,thanks!
WACR 2008.04.29
*
头文件:
#ifndef ESTRING_H
#define ESTRING_H
#include<iostream>
using std::ostream;
class EString{
public:
friend ostream& operator<<(ostream& os,const EString& str) ;
friend EString operator+(const EString& s1,const EString& s2) ; //二元 operator+
public:
EString();
EString(const char *str); //赋值构造兼默认构造函数(char)
EString(const EString &other); //赋值构造函数(EString)
EString& operator=(const EString&other); //operator=
void operator+=(const EString& other) ; //operator+=
bool operator==(const EString&); //operator==
char& operator[](unsigned int); //operator[]
operator const char *() const { return (const char *)m_data; }; //operator const char *
const char *c_str() const
{
if(m_data) return (const char *)m_data;
else
return "";
};
size_t size() const { return length;};
size_t GetLength() const { return length; };
~EString() ;
private:
size_t length;
char *m_data;
};
#endif
实现文件:
#include "EString.h"
#include <string.h>
EString::EString()
{
length=0;
m_data=0;
}
EString::EString(const char *str)
{
if (!str)
{
length=0;
m_data=0;
}
else
{
m_data = new char[strlen(str)+1];
strcpy(m_data,str);
length = strlen(str);
}
}
EString::EString(const EString& other)
{
if(!other.m_data) {
if(m_data) delete []m_data;
length = 0;
m_data=0;
}
else {
m_data=new char[strlen(other.m_data)+1];
strcpy(m_data,other.m_data);
length = strlen(other.m_data);
}
}
EString::~EString()
{
if(m_data)
delete []m_data;
}
EString& EString::operator=(const EString& other)
{
if(m_data==other.m_data)
return *this;
if(m_data) delete []m_data;
if(!other.m_data) {
length =0;
m_data=0;
}
else {
m_data = new char[strlen(other.m_data)+1];
strcpy(m_data,other.m_data);
length =strlen(other.m_data);
}
return *this;
}
bool EString::operator==(const EString &s)
{
if(m_data==s.m_data)
return true;
return (length==s.length)? false:true;
}
char& EString::operator[](unsigned int e)
{
if (e<=length)
return m_data[e];
}
void EString::operator+=(const EString& other)
{
char *tmp_data;
if(!m_data) {
if(other.m_data) {
m_data=new char[strlen(other.m_data)+1];
strcpy(m_data,other.m_data);
length =strlen(m_data);
}
}
else {
if(!other.m_data) {
delete []m_data;
m_data=0;
length =0;
}
else {
tmp_data=m_data;
m_data = new char[strlen(tmp_data)+strlen(other.m_data)+1];
strcpy(m_data,tmp_data);
strcat(m_data,other.m_data);
delete []tmp_data;
length =strlen(m_data);
}
}
}
ostream& operator<<(ostream& os,const EString& str)
{
if(str.m_data)
return os << str.m_data;
else
return os<<"";
}
EString operator+(const EString& s1,const EString& s2)
{
EString ret_str;
ret_str= s1;
ret_str+=s2;
return ret_str;
}