class CString
{
public:
 CString();
 CString(const CString &strTag);
 CString(const char* szTag); virtual ~CString();
 
public:
 char* GetBuffer();public:
 CString& operator=(const char* strTag);
 CString& operator=(const CString& strTag);
 CString& operator+(const char* szAdd);
 CString& operator+(const CString& strTag);public:
 void InitData(const char* szInit);
 friend ostream& operator<< ( ostream& os, const CString& strOut );private:
 char* m_pszData;
 int m_nBufLen;
};
.CPP 文件#include "CString.h"
CString::CString()
{
 m_pszData=NULL;
 m_nBufLen = 1;
 m_pszData = new char[m_nBufLen];
 m_pszData[0] = '\0';
}CString::~CString( )
{
 if( m_pszData )
 {
  delete m_pszData;
  m_pszData = NULL;
  m_nBufLen = 0;
 }
}void CString::InitData(const char *szInit)
{
 if( m_pszData )
 {
  delete m_pszData;
  m_pszData = NULL;
  m_nBufLen = 0;
 }
 
 int nLen = strlen(szInit);
 m_pszData = new char[nLen+1];
 if( m_pszData )
 {
  strncpy(m_pszData,szInit,nLen);
  m_pszData[nLen] = '\0';
  m_nBufLen = nLen+1;
 }
}CString::CString(const CString &strTag)
{
 m_pszData=NULL;
 m_nBufLen = 0;
 InitData(strTag.m_pszData);
}CString::CString(const char* szTag)
{
 m_pszData=NULL;
 m_nBufLen = 0;
 InitData(szTag);
}CString& CString::operator +(const char* szAdd)
{
 int nLenthis = strlen(m_pszData);
 int nLenAdd = strlen(szAdd);
 char* pAdd = new char[nLenthis+nLenAdd+1];
 strncpy(pAdd,m_pszData,nLenthis+1);
 strcat(pAdd,szAdd); static CString strAdd;
 strAdd = pAdd;
 delete pAdd; return strAdd;
}CString& CString::operator+(const CString& strTag)
{
 return operator+(strTag.m_pszData);
}
CString& CString::operator =(const char *szTag)

 int nTagLen = strlen(szTag);
 char* pszAdd = new char[nTagLen+1];
 if( pszAdd )
 {
  strncpy(pszAdd,szTag,nTagLen+1);
  m_nBufLen = nTagLen+1;  delete m_pszData;
  m_pszData = pszAdd;
 }
 return *this;
}CString& CString::operator =(const CString &strTag)
{
 return operator=(strTag.m_pszData);
}ostream& operator<< ( ostream& os, const CString& strOut )
{
 os<<strOut.m_pszData;
 return os;
}char* CString::GetBuffer()
{
 return m_pszData;
}///////////////////////////////////////////////////////////////////////
//
//   测试程序 The test program
//void main()
{
 CString str1("Hello");
 CString str2("world!");
 CString str3;
 
 cout<<"HTTP://WWW.5701.COM   EM:[email protected]"<<endl;
 cout<<"Class CString by Wenjin 2005.3"<<endl;
 cout<<"----------------------------------------"<<endl;
 cout<<"define CString str1(\"Hello\");"<<endl;
 cout<<"define CString str2(\"world!\");"<<endl;
 cout<<"define CString str3;"<<endl<<endl;
 cout<<"Para str1 = "<<str1<<endl;
 cout<<"Para str2 = "<<str2<<endl;
 cout<<"Para str3 = "<<str3<<endl<<endl; cout<<"str1 + \' \' + str2 = "<<str1+" "+str2<<endl<<endl;
 cout<<"Do str3=str1+\' \'+str2"<<endl;
 str3 = str1+" "+str2;
 cout<<"Now str3 = "<<str3<<endl<<endl; cout<<"Now define CString str4(str3);"<<endl;
 CString str4(str3);
 cout<<"Para str4 = "<<str4<<endl<<endl;
 cout<<"Output ended.Press enter to quit"<<endl;
 cin.peek();
}

解决方案 »

  1.   

    csdn 是不是要倒闭了?没有人呢operator +使用 static 变量,有没有更好的办法?
      

  2.   

    可以参考一下MFC中的CString类的源代码,实现一下 "!=" "==" 运算符,以及一些非常有用的函数Replace等函数!~
      

  3.   

    operator +
    可能只好用static变量了,难道用static变量不好吗?多这么一点内存消耗应该不是问题吧。楼主对CString封装的还真不错。只要愿意,楼主还可以多增加一些好用的成员函数,造福人类哟。不过MFC中CString应该够用了。多写写可以提高水平。
      

  4.   

    嗯。支持!但MFC的CString有个功能:
    比如我写个函数:
    func(CString strArg){}
    调用时即使:func("abc")也是可以的。
    这是什么原因?是构造函数CString::CString(LPCTSTR lpsz)
    还是操作符重载const CString& CString::operator=(LPCTSTR lpsz)
    使然?
      

  5.   

    CString还重载了LPCTSTR操作符!上面的这个问题似乎是:
    _AFX_INLINE CString::operator LPCTSTR() const
    { return m_pchData; }
    的 作用把
      

  6.   

    operator +
    可能只好用static变量了,难道用static变量不好吗?多这么一点内存消耗应该不是问题吧。
    我认为有内存占用而不释放始终还是不对的
      

  7.   

    kao 猪在这里成高手了啊工作找得怎么样了?
      

  8.   

    可以继承MSDN的CString来丰富其方法,否则如果用你自己的类来玩玩还可以,实际应用就免了吧
      

  9.   

    有创意.
    但是最好.把 char 改为 wchar_t不要在用这个char了.
      

  10.   

    我见过一个和CString几乎一模一样的,但是据说比CString快10倍..
      

  11.   

    CString& CString::operator +(const char* szAdd)
    {
     int nLenthis = strlen(m_pszData);
     int nLenAdd = strlen(szAdd);
     char* pAdd = new char[nLenthis+nLenAdd+1];
     strncpy(pAdd,m_pszData,nLenthis+1);
     strcat(pAdd,szAdd); static CString strAdd;
     strAdd = pAdd;
     delete pAdd;
     return strAdd;
    }
    -------------------------------------------------------
    今天看书找到了好的办法了,不过没上机调试 随手写下
    CString CString::operator +(const char* szAdd)
    {
     int nLenthis = strlen(m_pszData);
     int nLenAdd = strlen(szAdd);
     char* pAdd = new char[nLenthis+nLenAdd+1];
     strncpy(pAdd,m_pszData,nLenthis+1);
     strcat(pAdd,szAdd); CString strAdd;
     strAdd = pAdd;
     delete pAdd; return strAdd;
    }
      

  12.   

    直接返回一个值,没有返回引用了这样就不要 static 说明了,不错
      

  13.   

    CString& CString::operator +(const char* szAdd)
    {
     int nLenthis = strlen(m_pszData);
     int nLenAdd = strlen(szAdd);
     char* pAdd = new char[nLenthis+nLenAdd+1];
     strncpy(pAdd,m_pszData,nLenthis+1);
     strcat(pAdd,szAdd); static CString strAdd;
     strAdd = pAdd;
     delete pAdd; return strAdd;
    }恶心的写法!
      

  14.   

    CString CString::operator +(const char* szAdd)
    {
     int nLenthis = strlen(m_pszData);
     int nLenAdd = strlen(szAdd);
     char* pAdd = new char[nLenthis+nLenAdd+1];
     strncpy(pAdd,m_pszData,nLenthis+1);
     strcat(pAdd,szAdd); CString strAdd;
     strAdd = pAdd;
     delete pAdd; return strAdd;
    }
    更恶心的写法!