Проблема с перегрузкой оператора - PullRequest
3 голосов
/ 08 декабря 2011

В настоящее время я пытаюсь переписать оператор + = для класса, который я написал под названием mystring:

MyString& operator+=(MyString& s1, const MyString& s2)
{

    int newStringLength = s1.length + s2.length;
    char* newStorage = new char[newStringLength +  1];

    strcpy(newStorage, s1.data);

    strcpy(newStorage + s1.length, s2.data);
    delete[] s1.data;

    s1.length = newStringLength;
    s1.data = newStorage;

    return s1;

}

MyString operator+(const MyString& s1, const MyString& s2)
{

    MyString temp;
    delete[] temp.data;

    temp.length = s1.length;
    temp.data = new char[temp.length+1];

    strcpy(temp.data, s1.data);
    temp+=s2;

    return temp;

}

Где длина - длина строки, а данные - строка, хранящаяся в формате char *.

Программа отлично работает, когда я пытаюсь сделать что-то вроде:

MyString test1 = "hi";
MyString test2 = "to"; 

test1 += test2;

Но не работает, когда я пытаюсь что-то вроде:

   MyString test;
    MyString test1 = "hi";
    MyString test2 = "to"; 

    test += test2 + test1
          += "you";

В основном, когда я запускаюсмешивание + = и + попеременно, это не работает.Вот ошибка при компиляции:

testoutput.cpp:26: error: no match for ‘operator+=’ in ‘operator+(const MyString&, const MyString&)(((const MyString&)((const MyString*)(& test1)))) += "you"’
mystring.h:45: note: candidates are: MyString& operator+=(MyString&, const MyString&)

Кто-нибудь знает, как я могу изменить свой код для достижения этой функциональности?

Ответы [ 2 ]

3 голосов
/ 08 декабря 2011

Нет смысла смешивать + и += таким образом. Я не совсем уверен, каково ваше предполагаемое поведение, но если вы хотите, чтобы вложенная += применялась к test1, вам придется использовать круглые скобки:

test += test2 + (test1 += "you");

Это не проблема с вашим оператором присваивания, но с приоритетом оператора в языке. Если вы замените MyString на int, вы столкнетесь с теми же проблемами.

Приоритет и ассоциативность операторов + и += приводят к тому, что выражение без скобок интерпретируется следующим образом:

test += ((test2 + test1) += "you");

Это пытается присвоить test2 + test1, но это невозможно (вы можете назначать только переменные). Этот приоритет оператора не может быть изменен, и без скобок выражение всегда будет интерпретироваться таким образом.

0 голосов
/ 08 декабря 2011

Ваша ошибка здесь:

test += test2 + test1 += "you";

Программа создаст временный объект из 'test2 + test1' и вызовет для него оператор + = ().Проблема в том, что в одном выражении 2 вызова оператора + =, и неизвестно, какой из них будет вызван первым.Таким образом, результат оператора + = (TemporaryObject, MyString ("you")) может быть потерян;

Чтобы предотвратить это, вы должны объявить operator + следующим образом:

const MyString operator+(const MyString& s1, const MyString& s2)

Если вы сделаете это,компилятор сможет сообщить об ошибке, если он наткнется на такие выражения с непредсказуемым результатом;

Edit:

Теперь, когда у нас есть выходные данные компилятора, я вижу, что компилятор достаточно умен, чтобы видетьчто объект, созданный из оператора + (), является временным.Итак, вам просто нужно сделать 2 выражения вместо 1:

test += test2 + test1;
test += "you";

Но все же я предлагаю вернуть объект const из вашего оператора + ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...