求各位C++大神相助啊 关于Mystring类
代码如下:
main.cpp
#include "MyString.h"
void main( )
{
MyString s1;
MyString s2;
MyString s3;
MyString s4("abcdef");
cin>>s1>>s2;
s3=s1+s2;//调试发现这一行中“=”的重载,并未将“+”重载的结果结果赋值给S3。发现S3最后结果为几个汉字和问号,当输入S1为,S2为b时。请各位大神相助一下啊
cout<<s3<<endl;
for(int i=0;i<s3.length();i++)
cout<<s3[i];
cout<<endl;
//比较两个字符串的大小,按字符顺序
if(s1>s2)
cout<<s1<<"is more lager than "<<s2<<endl;
//输出s4在s3中位置
cout<<s3.find(s4);
}
MyString.h
#include<iostream>
#include<cstring>
using namespace std;
class MyString
{
public:
MyString();
MyString(const char *str);
MyString(const MyString &other);
bool operator>(const MyString& str);
MyString operator+(const MyString& str) const;
MyString& operator=(const MyString &str);
char operator[](int order);
friend ostream& operator<< (ostream&os,MyString&str)
{
os<<str.m_data;
return os;
}
friend istream& operator>>(istream &input,MyString &str)
{
input>>str.m_data;
return input;
}
int find(MyString str);
int length(){return len;}
void Display();
~MyString(){delete []m_data;}
private:
char * m_data;
int len;
};
MyString.cpp
#include"MyString.h"
#include <stdio.h>
MyString::MyString()
{
m_data=new char[1];
//char *s="\0";
//memcpy(m_data,s,1);
m_data[0]=0;
len=0;
}
MyString::MyString(const char *str)
{
if(str==NULL)
{
m_data=new char[1];
m_data[0]=0;
len=0;
}
else
{
m_data=new char[strlen(str)+1];
strcpy(m_data,str);
len=strlen(str)+1;
}
}
MyString::MyString(const MyString &other)
{
int n=len=other.len;
if(m_data=new char[n+1])
{
for (int i=0;i<n;i++)
m_data[i]=other.m_data[i];
}
else
cout<<"error"<<endl;
}
bool MyString::operator>(const MyString& str)
{
// if(len>str.len)len=str.len;
//for(int i=0;i<len;i++)
//{
//if(m_data[i]>str.m_data[i])
//return true;
//else
//return false;
return strcmp(m_data,str.m_data)>0;
//}
}
MyString& MyString::operator=(const MyString &str)
{
delete []m_data;
m_data=new char[strlen(str.m_data)+1];
strcpy(m_data,str.m_data);
return *this;
}
char MyString::operator[](int order)
{
if(order<len)
return m_data[order];
else
{
cout<<"下标越界!:";
return m_data[0];
}
}
void MyString::Display()
{
printf("%s\n",m_data);
}
int MyString::find(MyString str)
{
if(strstr(m_data,str.m_data) != NULL)
{
for(int i=0;i<len;i++)
{
if(m_data[i] == str.m_data[0])
{
bool IsEqual = true;
for(int j= 1;j<str.len;j++)
{
if(str.m_data[j] != m_data[i+j])
{
IsEqual = false;
break;
}
}
if(IsEqual == true)
return i;
}
}
}
return -1;
}
MyString MyString::operator+(const MyString& str) const
{
MyString newstring;
if(!str.m_data)
newstring=*this;
else if(!m_data)
newstring=str;
else
{
newstring.m_data=new char[strlen(m_data)+strlen(str.m_data)+1];
strcpy(newstring.m_data,m_data);
strcat(newstring.m_data,str.m_data);
}
return newstring;
}
[解决办法]
MyString operator+(const MyString& str) const;
MyString& operator=(const MyString &str);
额,楼主为什么你的编程风格跟我的不一样呢?除了=,一般的重载运算符要用friend吧:
friend MyString operator +(const MyString& left, const MyString& right);
而=应该是一个空的成员函数:
void operator =(const MyString& right_side);
[解决办法]
[解决办法]
不同意楼上一般的重载运算符要用friend。
问题出在operator+里面。
newstring初始化是一个‘\0’结尾的空串,通过拷贝和连接之后,末尾要添加一个‘\0’。