1

MyStringクラスの演算子+および+=をオーバーロードする必要があります。

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は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+=通常はメンバー関数です。左側の引数を変更し、への参照を返します*thisoperator+通常、新しく作成されたオブジェクトを返す非メンバー関数です。で簡単に実装できる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 に答える