阅读:1827回复:8
写了一个String类,请各位高手指点
MyString.h:
#ifndef __FILBER_HOME_STRING_H__ #define __FILBER_HOME_STRING_H__ namespace FilberHome{ class String{ private: char *_ptr; unsigned int _len; public: String(); String(const char *); String(const String &); ~String(); String& operator= ( const String& rhs ); String& operator= ( const char *rhs ); char& operator[]( unsigned int idx ); const char& operator[]( unsigned int idx ) const; char * c_str(); const char* c_str() const; friend const String operator+ (const String& lhs, const String& rhs); friend std::ostream& operator<< ( std::ostream& lhs, const String& rhs ); friend std::istream& operator>> ( std::istream& lhs, const String& rhs ); const unsigned int len() const { return _len; } const unsigned int size() const { return _len + 1; } private: char *Alloc( unsigned int len ); void initStr() { _ptr = new char[1]; if(NULL == _ptr) throw("No resources, Class String"); *_ptr = '\0'; _len = 0; } }; bool operator< ( const String& lhs, const String& rhs ); bool operator== ( const String& lhs, const String& rhs ); } #endif MyString.c: #include <iostream> #include <memory> #include <assert.h> #include <string.h> #include "Mystring.h" namespace FilberHome{ String::String() { initStr(); } String::String( const String& str ) { _ptr = new char[ str.len() + 1 ]; if(NULL == _ptr) throw("No resources, Class String"); strcpy( _ptr, str.c_str() ); _len = str.len(); } String::String( const char *str ) { if( NULL == str ){ initStr(); } else { _len = strlen(str); _ptr = new char[_len + 1]; if(NULL == _ptr) throw("No resources, Class String"); strcpy( _ptr, str ); } } String::~String() { delete [] _ptr; } char *String::Alloc( unsigned int len ) { assert( len >= 0 ); if( len == _len ) return _ptr; if( _ptr ) delete [] _ptr; _ptr = new char[len + 1]; if(NULL == _ptr) throw("No resources, Class String"); memset(_ptr, 0, (len + 1) * sizeof(char)); _len = len; return _ptr; } String& String::operator =( const char *rhs ) { delete[] _ptr; _len = strlen( rhs ); _ptr = new char[_len + 1]; if(NULL == _ptr) throw("No resources, Class String"); strcpy(_ptr, rhs); return *this; } String& String::operator =( const String &rhs ) { if( &rhs == this ) return *this; delete [] _ptr; _len = rhs.len(); _ptr = new char[ _len + 1 ]; if(NULL == _ptr) throw("No resources, Class String"); strcpy(_ptr, rhs.c_str()); return *this; } char& String::operator[]( unsigned int idx ) { assert( idx >= 0 && idx < _len ); return _ptr[idx]; } const char& String::operator []( unsigned int idx ) const { assert( idx >= 0 && idx < _len ); return _ptr[idx]; } char* String::c_str() { return _ptr; } const char* String::c_str() const { return _ptr; } const String operator+( const String& lhs, const String& rhs ) { String temp; temp.Alloc( lhs.len() + rhs.len() + 1 ); strcpy( temp._ptr, lhs.c_str()); strcat( temp._ptr, rhs.c_str()); return temp; } std::ostream& operator<< ( std::ostream& lhs, const String& rhs ) { lhs << rhs._ptr; return lhs; } std::istream& operator>> ( std::istream& lhs, const String& rhs ) { return lhs; } bool operator< ( const String& lhs, const String& rhs ) { const char *lptr = lhs.c_str(); const char *rptr = rhs.c_str(); while( (*lptr == *rptr) && *lptr++ && *rptr++ ); if( *lptr < *rptr ) return true; else return false; } bool operator== ( const String& lhs, const String& rhs ) { if( lhs.len() != rhs.len() ) return false; const char *lptr = lhs.c_str(); const char *rptr = rhs.c_str(); while( (*lptr++ == *rptr++) ); if( *lptr == '\0' ) return true; return false; } } |
|
|
沙发#
发布于:2004-07-24 15:35
private:
char *Alloc( unsigned int len ); void initStr() { _ptr = new char[1]; if(NULL == _ptr) throw("No resources, Class String"); *_ptr = '\0'; _len = 0; } }; bool operator< ( const String& lhs, const String& rhs ); bool operator== ( const String& lhs, const String& rhs ); } #endif |
|
|
板凳#
发布于:2004-07-24 15:35
MyString.c:
#include <iostream> #include <memory> #include <assert.h> #include <string.h> #include "Mystring.h" namespace FilberHome{ String::String() { initStr(); } String::String( const String& str ) { _ptr = new char[ str.len() + 1 ]; if(NULL == _ptr) throw("No resources, Class String"); strcpy( _ptr, str.c_str() ); _len = str.len(); } String::String( const char *str ) { if( NULL == str ){ initStr(); } else { _len = strlen(str); _ptr = new char[_len + 1]; if(NULL == _ptr) throw("No resources, Class String"); strcpy( _ptr, str ); } } String::~String() { delete [] _ptr; } char *String::Alloc( unsigned int len ) { assert( len >= 0 ); if( len == _len ) return _ptr; if( _ptr ) delete [] _ptr; _ptr = new char[len + 1]; if(NULL == _ptr) throw("No resources, Class String"); memset(_ptr, 0, (len + 1) * sizeof(char)); _len = len; return _ptr; } |
|
|
地板#
发布于:2004-07-24 15:36
String& String::operator =( const char *rhs )
{ delete[] _ptr; _len = strlen( rhs ); _ptr = new char[_len + 1]; if(NULL == _ptr) throw("No resources, Class String"); strcpy(_ptr, rhs); return *this; } String& String::operator =( const String &rhs ) { if( &rhs == this ) return *this; delete [] _ptr; _len = rhs.len(); _ptr = new char[ _len + 1 ]; if(NULL == _ptr) throw("No resources, Class String"); strcpy(_ptr, rhs.c_str()); return *this; } char& String::operator[]( unsigned int idx ) { assert( idx >= 0 && idx < _len ); return _ptr[idx]; } const char& String::operator []( unsigned int idx ) const { assert( idx >= 0 && idx < _len ); return _ptr[idx]; } char* String::c_str() { return _ptr; } const char* String::c_str() const { return _ptr; } const String operator+( const String& lhs, const String& rhs ) { String temp; temp.Alloc( lhs.len() + rhs.len() + 1 ); strcpy( temp._ptr, lhs.c_str()); strcat( temp._ptr, rhs.c_str()); return temp; } std::ostream& operator<< ( std::ostream& lhs, const String& rhs ) { lhs << rhs._ptr; return lhs; } std::istream& operator>> ( std::istream& lhs, const String& rhs ) { return lhs; } bool operator< ( const String& lhs, const String& rhs ) { const char *lptr = lhs.c_str(); const char *rptr = rhs.c_str(); while( (*lptr == *rptr) && *lptr++ && *rptr++ ); if( *lptr < *rptr ) return true; else return false; } bool operator== ( const String& lhs, const String& rhs ) { if( lhs.len() != rhs.len() ) return false; const char *lptr = lhs.c_str(); const char *rptr = rhs.c_str(); while( (*lptr++ == *rptr++) ); if( *lptr == '\0' ) return true; return false; } } |
|
|
地下室#
发布于:2004-07-24 15:36
bool operator== ( const String& lhs, const String& rhs )
{ if( lhs.len() != rhs.len() ) return false; const char *lptr = lhs.c_str(); const char *rptr = rhs.c_str(); while( (*lptr++ == *rptr++) ); if( *lptr == '\0' ) return true; return false; } } |
|
|
5楼#
发布于:2004-07-24 15:37
这个网站对代码的支持不好,搞得大家都懒得看这样的代码了,原本我的代码都是非常规范的
|
|
|
6楼#
发布于:2004-07-25 14:48
这个网站对代码的支持不好,搞得大家都懒得看这样的代码了,原本我的代码都是非常规范的 是的,常常发生错落现象!看代码非常难受! |
|
7楼#
发布于:2004-07-26 09:00
STL的STRING不够你用?
|
|
|
8楼#
发布于:2004-07-26 09:30
好,最好对UNICODE也写一个,并且可以在驱动中使用的,那样才有意义......
|
|
|