帮北航小妹妹做的一道她的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,这样的形式.和平常的用法不一样(这个是不是推荐操作符重载使用友元而不是成员函数的原因啊?呵呵)
posted @   吴东雷  阅读(1132)  评论(5编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示