#include
"
stdafx.h
"
#include
"
MyString.h
"

//
:public MyString,在声明里指定了继承.
class
UpperCase:
public
MyString
{
public:
UpperCase( const char * str= 0 );
UpperCase( const string & str);
virtual void copy( const char * str);
virtual void strCat(const string & str);
virtual void strCat(const char * str);

//这里是进行操作符重载,以便可以实现类似于str="123"或str+="123"这样的方式,这样使咱们的自定义类可以像普通类型一样进行操作
UpperCase & operator =(const char * str);
UpperCase & operator +=(const char * str);
//这里是使用友元方式进行的重载,我偿试用成员函数的方式重载,但不知道为什么报错.呵,钱能的C++书上有这样写,我在网上找资料也有这样写的.
friend ostream & operator <<(ostream & outstream,UpperCase & str);
friend istream & operator >>(istream & instream,UpperCase & str);
private:
void ToUpper(char * str);
}
;
#include
"
stdafx.h
"
#include
"
UpperCase.h
"

//
UpperCase的构造函数,其中:MyString(str)表示调用父类的这个构造函数
UpperCase::UpperCase(
const
char
*
str):MyString(str)
{
this->ToUpper(this->myStr);
}
;
UpperCase::UpperCase(
const
std::
string
&
str):MyString(str)
{
this->ToUpper(this->myStr);
}
;
//
下面的几个重写的方法我都是用类似于copy的方式,生成一个新的字符指针,然后转换成大写,再调用父类的相关方法
void
UpperCase::copy(
const
char
*
str)
{
char * temp=new char[strlen(str)+1];
strcpy_s(temp,strlen(str)+1,str);
this->ToUpper(temp);
MyString::copy(temp);
delete temp;
}
;
void
UpperCase::strCat(
const
char
*
str)
{
char * temp=new char[strlen(str)+1];
strcpy_s(temp,strlen(str)+1,str);
this->ToUpper(temp);
MyString::strCat(temp);
delete temp;
}
;
void
UpperCase::strCat(
const
std::
string
&
str)
{
char * temp=new char[strlen(str.c_str())+1];
strcpy_s(temp,strlen(str.c_str())+1,str.c_str());
this->ToUpper(temp);
MyString::strCat(temp);
delete temp;
}
;
//
我自己加的一个方法,进行大写转换
void
UpperCase::ToUpper(
char
*
str)
{
for(size_t i=0;i<strlen(str);i++)
{
if(str[i]>='a' && str[i]<='z')
{
str[i]+='A'-'a';
}
}
}

//
下面这些是重载操作符的实现代码
UpperCase
&
UpperCase::
operator
=
(
const
char
*
str)
{
this->copy(str);
return *this;
}
UpperCase
&
UpperCase::
operator
+=
(
const
char
*
str)
{
this->strCat(str);
return (*this);
}
;
ostream
&
operator
<<
(std::ostream
&
outstream,UpperCase
&
str)
{
str.print();
return outstream;
}
;
istream
&
operator
>>
(std::istream
&
instream,UpperCase
&
str)
{
instream>>str.myStr;
return instream;
}
;
1.下载: 第4次作业的MyString实现
2.下载: UpperCase的实现
3.下载: UpperCase使用成员函数重载<<和>>操作符的实现(目前还有错误,正在找原因)
4.下载: UpperCase使用成员函数重载<<和>>操作符的实现(解决问题)
第3个错误的,其实在UpperCase类里没有问题,关键在于调用的时候.因为使用成员函数重载的<<和>>,这种方式下UpperCase对象是左操作数,调用的时候是这样的:str1<<cout;str1>>cin,而使用友元的方式下是:cout<<str1;cin<<str1,这样的形式.和平常的用法不一样(这个是不是推荐操作符重载使用友元而不是成员函数的原因啊?呵呵)
本文介绍了一个名为UpperCase的C++类,该类继承自MyString,并实现了字符串转换为大写的功能。通过重载操作符和使用友元函数,使得类能够像内置类型一样操作,包括赋值、连接和输入输出。

286

被折叠的 条评论
为什么被折叠?



