我需要为MyString类重载operator +和+ =。
MyString.h
class MyString
{
char* m_pStr;
};
主要
MyString s1("ABC"), s2("kkk");
MyString s("S");//GMV
s1 +=s;
s2 = s+s1;
stop
MyString.cpp
MyString MyString:: operator + (const MyString & rhs){
char * tmp = create_tmp_string(this->m_pStr, rhs.m_pStr);
return MyString(tmp);
};
MyString & MyString:: operator += (const MyString & rhs){
char * tmp = create_tmp_string(this->m_pStr, rhs.m_pStr);
return MyString(tmp);
};
char* MyString:: create_tmp_string(char * one, char * two){
int total_length = strlen(one) + strlen(two);
char * tmp = new char[total_length + 1];
tmp[0] = '\0';
strcat(tmp, one);
strcat(tmp, two);
return tmp;
}
我的问题是:
s2 = s+s1; // Working
s1 +=s; // Not working.
好吧,当我逐步执行代码时:
MyString & MyString:: operator += (const MyString & rhs){
char * tmp = create_tmp_string(this->m_pStr, rhs.m_pStr);
return MyString(tmp);
};
tmp turnes将成为SABC。但是s1将不包含SABC并且仍然持有ABC。
你能帮帮我吗?
答案 0 :(得分:4)
您的operator+=
应该返回*this
而不是本地变量。
答案 1 :(得分:4)
此
MyString & MyString:: operator += (const MyString & rhs){
char * tmp = create_tmp_string(this->m_pStr, rhs.m_pStr);
return MyString(tmp);
};
应该是这样的
MyString & MyString:: operator += (const MyString & rhs){
char * tmp = create_tmp_string(this->m_pStr, rhs.m_pStr);
*this = MyString(tmp);
return *this;
};
假设您的operator =正常工作。
但实际上有一种更简单的方法。只需根据另一个运算符编写一个运算符,例如使用operator + =
编写运算符+MyString operator+(const MyString& x, const MyString& y)
{
MyString res = x;
res += y;
return res;
}
或者你可以反过来做到这一点
MyString& MyString::operator+=(const MyString& x)
{
*this = *this + x;
return *this;
}
答案 2 :(得分:3)
operator+=
通常是会员功能;它修改了左侧参数并返回对*this
的引用。 operator+
通常是一个非成员函数,它返回一个新创建的对象;它可以使用operator+=
轻松实现,因此不需要知道任何实现细节。
答案 3 :(得分:2)
在operator +=
中你应该重写* this的值。
MyString & MyString:: operator += (const MyString & rhs){
char * tmp = create_tmp_string(this->m_pStr, rhs.m_pStr);
// seems you own m_pStr. In this case
// don't forget, you should make deep copy in copy constructors and
// delete in destructor.
delete this->m_pStr;
this->m_pStr = tmp;
return *this;
};
之后,您可以使用operator +
operator +=
MyString operator + (const MyString& rhs){
MyString copy = *this;
return copy += rhs;
}