帮北航小妹妹做的一道她的C++的作业题.
UpperCase.h
#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);
};
UpperCase.cpp
#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;
};
基本上就是这样了.我把代码打包了,你可以下载看看,我的编译环境是VC++.Net 2005.
1.下载:第4次作业的MyString实现
2.下载:UpperCase的实现
3.下载:UpperCase使用成员函数重载<<和>>操作符的实现(目前还有错误,正在找原因)
4.下载:UpperCase使用成员函数重载<<和>>操作符的实现(解决问题)
第3个错误的,其实在UpperCase类里没有问题,关键在于调用的时候.因为使用成员函数重载的<<和>>,这种方式下UpperCase对象是左操作数,调用的时候是这样的:str1<<cout;str1>>cin,而使用友元的方式下是:cout<<str1;cin<<str1,这样的形式.和平常的用法不一样(这个是不是推荐操作符重载使用友元而不是成员函数的原因啊?呵呵)
































































































1.下载:第4次作业的MyString实现
2.下载:UpperCase的实现
3.下载:UpperCase使用成员函数重载<<和>>操作符的实现(目前还有错误,正在找原因)
4.下载:UpperCase使用成员函数重载<<和>>操作符的实现(解决问题)
第3个错误的,其实在UpperCase类里没有问题,关键在于调用的时候.因为使用成员函数重载的<<和>>,这种方式下UpperCase对象是左操作数,调用的时候是这样的:str1<<cout;str1>>cin,而使用友元的方式下是:cout<<str1;cin<<str1,这样的形式.和平常的用法不一样(这个是不是推荐操作符重载使用友元而不是成员函数的原因啊?呵呵)
一点说明:为什么在标题中要嵌入英文?原因是为了能够让国外的网友能查询到这篇文章。平常在Google上查资料的时候,经常参考国外网友的博客,帮助我解决了很多问题,所以我也想让他们能够参考我写的内容。当然文中我不可能全部译为英文,所以我尽量把代码粘全,靠代码说话吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端