dcsimg

Simple String Class

WEBINAR:
On-Demand

Desktop-as-a-Service Designed for Any Cloud ? Nutanix Frame


Environment: VC6, NT4 SP5, Windows 95b/98

Background

Although both MFC and STL provide the CString and the string class to manipulate strings, In my recent project I have to develop a simple string class for my particular use. The future includes formatting string, similar to MFC format; searching string with the given wildcards; and numeric conversion with the desired data type.

Class Definition

class CStr
{
public:
 // constructors and destructor
 CStr(const CStr& str);
 CStr(const char* str);
 CStr(const double var)				
  { VarToString(var); }

 CStr()
  { m_nLength = 0; m_pString = 0; }

 virtual ~CStr()						
  { if (m_pString) delete m_pString; }

 // operator overloading helper
 template <class T> friend CStr _cdecl operator +(T var, const CStr& str);

 // operator overloading
 CStr& operator  =(const char* str);
 CStr& operator  =(const CStr& str);

 CStr& operator  =(const double var)	
 { VarToString(var); return *this; }

 template<class T>
 CStr  operator  +(T var)			
 { CStr tstr = *this; return tstr += var; }

 CStr& operator +=(double str)		
 { return *this += (CStr)str; }

 CStr& operator +=(const char* str)	
 { return *this += (CStr)str; }

 CStr& operator +=(const CStr& str);

 // add more logic comparison operators as following,
 // for example, although not efficient
 virtual bool operator !=(char* str)	
  { return strcmp(str, m_pString) != 0; }

 // c type string conversion
 operator char* ()
  { return m_pString; }

 operator const char* () const		
  { return m_pString; }

 char* GetChar()
  { return m_pString; }

 // numeric conversion
 template <class T> GetValue(T& var)
  { return GetVar(var); }

 // search the match string : 
 // WildCards can be '?' and '*' combination
 // return value : true (pattern matchs string), false (no match)
 bool Search(const char* WildCards)	
  { return Match((char*)WildCards, m_pString); }

 // format string
 int Format(const char* format, ...);

protected:
 // can use faster algorithm for search ?
 virtual bool Match(char*, char*);

 virtual bool Scan(char*&, char*&);

 // have any good conversion method ?
 virtual void VarToString(const double var);

 // numeric conversion helpers
 bool NumericParse(void* pvar, char flag);
 
 bool GetVar(bool& var)				
  { return NumericParse((void*)&var, 'b'); }

 bool GetVar(char& var)				
  { return NumericParse((void*)&var, 'c'); }

 bool GetVar(short& var)				
  { return NumericParse((void*)&var, 's'); }

 bool GetVar(int& var)				
  { return NumericParse((void*)&var, 'i'); }

 bool GetVar(long& var)				
  { return NumericParse((void*)&var, 'l'); }

 bool GetVar(float& var)				
  { return NumericParse((void*)&var, 'f'); }

 bool GetVar(double& var)			
  { return NumericParse((void*)&var, 'd'); }

 bool GetVar(unsigned char& var)		
  { return NumericParse((void*)&var, 'C'); }

 bool GetVar(unsigned short& var)	
  { return NumericParse((void*)&var, 'S'); }

 bool GetVar(unsigned int& var)		
  { return NumericParse((void*)&var, 'I'); }

 bool GetVar(unsigned long& var)		
  { return NumericParse((void*)&var, 'L'); }
    

// data block
 int   m_nLength;
 char* m_pString;
};

template <class T>
CStr operator +(T var, const CStr& str) 
{ 
 CStr svar = var;
 return svar += str; 
}

Source Code

The implemented file Str.cpp is independent on MFC and STL string class. Hope this simple string class can be used in most platform. Note that some UNIX C++ compilers do not support snprintf.

Demo Project

StrDemo.cpp demonstrates how to use string numeric conversion, format, and search. Note that the numeric type plus CStr is legal, such as 6.456 + (CStr)"hyt" will produce "6.456hyt" and (CStr)"hyt" + '1' will produce "hyt49". If you do not like that, please modify binary operator CStr operator +(T var, const CStr& str) and corresponding member functions.

Downloads

Download demo project - 6 Kb
Download source - 3 Kb


Comments

  • There are no comments yet. Be the first to comment!

  • You must have javascript enabled in order to post comments.

Leave a Comment
  • Your email address will not be published. All fields are required.

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date