yyzzbb_yang
驱动牛犊
驱动牛犊
  • 注册日期2004-05-15
  • 最后登录2005-04-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1827回复:8

写了一个String类,请各位高手指点

楼主#
更多 发布于:2004-07-24 15:34
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;

}


}
喜欢写程序,喜欢驱动!
yyzzbb_yang
驱动牛犊
驱动牛犊
  • 注册日期2004-05-15
  • 最后登录2005-04-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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
喜欢写程序,喜欢驱动!
yyzzbb_yang
驱动牛犊
驱动牛犊
  • 注册日期2004-05-15
  • 最后登录2005-04-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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;
}
喜欢写程序,喜欢驱动!
yyzzbb_yang
驱动牛犊
驱动牛犊
  • 注册日期2004-05-15
  • 最后登录2005-04-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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;

}


}
喜欢写程序,喜欢驱动!
yyzzbb_yang
驱动牛犊
驱动牛犊
  • 注册日期2004-05-15
  • 最后登录2005-04-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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;

}


}
喜欢写程序,喜欢驱动!
yyzzbb_yang
驱动牛犊
驱动牛犊
  • 注册日期2004-05-15
  • 最后登录2005-04-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-07-24 15:37
这个网站对代码的支持不好,搞得大家都懒得看这样的代码了,原本我的代码都是非常规范的
喜欢写程序,喜欢驱动!
Gong_XG
驱动太牛
驱动太牛
  • 注册日期2002-10-01
  • 最后登录2010-11-25
  • 粉丝0
  • 关注0
  • 积分313分
  • 威望46点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-07-25 14:48
这个网站对代码的支持不好,搞得大家都懒得看这样的代码了,原本我的代码都是非常规范的


是的,常常发生错落现象!看代码非常难受!
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-07-26 09:00
STL的STRING不够你用?
[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2004-07-26 09:30
好,最好对UNICODE也写一个,并且可以在驱动中使用的,那样才有意义......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部