1

我需要为 MyString 类重载运算符 + 和 += 。

我的字符串.h

    class MyString
    {
        char* m_pStr;   
    };

主要的

    MyString s1("ABC"), s2("kkk");
    MyString s("S");//GMV
    s1 +=s;
    s2 = s+s1;
    stop

我的字符串.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 原来是 SABC。但是 s1 将不包含 SABC 并且仍然持有 ABC。

你可以帮帮我吗?

4

4 回答 4

4

operator+=应该返回*this而不是局部变量。

于 2013-03-24T13:32:29.917 回答
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= 工作正常。

但实际上有一种更简单的方法可以做到这一点。只需根据另一个运算符编写一个运算符,例如使用运算符 += 编写运算符+

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;
}
于 2013-03-24T13:34:13.037 回答
3

operator+=通常是成员函数;它修改其左侧参数并返回对*this. operator+通常是一个非成员函数,它返回一个新创建的对象;它可以很容易地实现operator+=,所以它不需要知道任何实现细节。

于 2013-03-24T13:35:50.800 回答
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;
}
于 2013-03-24T13:34:04.183 回答