Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Перегрузка оператора присвоения


Автор: ipc 9.4.2012, 17:59
Доброго времени суток, господа.

Пишу проект на Embarcadero RAD Studio XE2 C++
Возникла необходимость простым способом написать объект, который бы проявлял свойства int или WideString в зависимости от ситуации.
Например, при присвоении значения с этими типами в ту или другую сторону. Унаследоваться от WideString не удалось, поэтому через вложения:

Код

struct Vary{
    WideString wsName;
    int iCount;

    Vary();
    ~Vary();

    // перегрузка операторов для работы Widestring
    Vary& operator =(WideString wsName);
    WideString  operator =(const Vary &varObj);
};

...
Vary& Vary::operator =(WideString wsNameInc){
    wsName = wsNameInc;
    return *this;
}

WideString  Vary::operator =(const Vary &varObj){
    return varObj.wsName;
}

...
// использование
    WideString wsTemp = "test";
    Vary varyTemp;

    varyTemp = wsTemp;
    WideString wsRes = varyTemp;
...


компилятор ругается на последнюю строчку:
E2285 Could not find a match for 'WideString::WideString(const WideString&)'

Я так понимаю, он хочет увидеть переопределенный конструктор копирования WideString, потому как сработало правило трех. Переопределение конструктора копирования не изменило ничего.

Подскажите, пожалуйста, как разрешить данную проблему?

Заранее спасибо!

Автор: disputant 9.4.2012, 18:20
А вот тут

Код

Vary& operator =(WideString wsName)


передачу через ссылку не пробовали организовать? Чтоб лишний раз ему копировать не надо было? Да и тут

Код

WideString  operator =(const Vary &varObj)


возвращать ссылку?

Автор: ipc 9.4.2012, 19:14
disputant, спасибо за скорый ответ.
Цитата

возвращать ссылку?


так?

Код

WideString & operator =(const Vary &varObj)


если "да", то не помогло, ошибка та же..
но за совет - спасибо

Автор: volatile 10.4.2012, 01:11
Цитата(ipc @  9.4.2012,  17:59 Найти цитируемый пост)
WideString  Vary::operator =(const Vary &varObj){
    return varObj.wsName;

Вам имхо нужен не оператор присваивания, а оператор приведения к WideString.
В общем то что выше удалите, а добавтье :
Код

operator WideString ()
{
   return wsName;
}


Добавлено через 2 минуты и 4 секунды
По крайней мере теперь, эта строчка, должна работать
Цитата(ipc @  9.4.2012,  17:59 Найти цитируемый пост)
  WideString wsRes = varyTemp;

в остальное не вникал...

Автор: ipc 10.4.2012, 10:19
volatile, спасибо! Помогло.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)