Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2009, 16:02   #1
Karasu
Новичок
Джуниор
 
Регистрация: 13.07.2009
Сообщений: 4
Вопрос Функции операторов

Доброго времени суток! Меня интересует следующий вопрос.
В одной книжке написано примерно так:
Если в классе есть конструктор и функция оператора:
Код:
CNumber(int n);
CNumber operator+(const CNumber &other);
то становится возможной следующая запись:
Код:
CNumber n1 = 1 + n2;
и написано, что компилятор сначала преобразует число 1 в класс CNumber, а затем вызовет функцию operator+.
В С++ Builder 6 создаю такой класс:
Код:
class CNumber
{
  int Number;
public:
  int get_n() const {return Number;}
  CNumber(int n) {Number = n;}
  CNumber operator+(const CNumber &other)
  {CNumber New(Number+other.get_n()); return New;}
};
Затем пишу:
Код:
CNumber n1(1), n2(2);
n1 = 3+n2;
и получаю [C++ Error] Unit1.cpp(29): E2096 Illegal structure operation
Если компилятор принудительно заставить преобразовать 3 в CNumber:
Код:
CNumber n1(1), n2(2);
n1 = (CNumber)3+n2;
то все работает. Также помогает создание дружка:
Код:
friend CNumber operator+(int n, CNumber &other);
Но мне все таки хочется узнать насчет первого варианта:
1. Я что-то непонимаю или где-то ошибаюсь
2. Автор книги допустил ошибку
3. Или в разных версиях компилятора данная ситуация обрабатывается по разному.

PS
Автор книги использует RHIDE и Visual Studio.
В моей Visual Studio 2005 похожая ситуация тоже не компиляется.
Karasu вне форума Ответить с цитированием
Старый 13.07.2009, 16:17   #2
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Если вы перегружаете оператор + таким образом объект=объект+данные нужно вызвать функцию в таком виде
Код:
MyClass operator+(MyClass obj);
Если же таким образом объект=данные+объект тогда так
Код:
friend MyClass operator+(int x, MyClass obj);
Если чесно такого никогда не встречал, точнее что бы так делали n1 = (CNumber)3+n2;

Советую вам книгу Г.Шилдта "Самоучитель С++", там подробно описана перегрузка операторов.

Последний раз редактировалось profi; 13.07.2009 в 16:20.
profi вне форума Ответить с цитированием
Старый 13.07.2009, 16:28   #3
Karasu
Новичок
Джуниор
 
Регистрация: 13.07.2009
Сообщений: 4
По умолчанию

Ну насчет глобальной функции оператора + я знаю.
В данном случае порядок операндов неважен но я хочу написать класс для работы со строками, там порядок важен и там у меня несколько конструкторов для разных типов, нехочется писать есчо несколько функций оператора для всех вариантов комбинации типов. Понимаю идея глупая, но всё же.
Karasu вне форума Ответить с цитированием
Старый 13.07.2009, 16:33   #4
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Хм... тогда вам настоятельно рекоменду пользоваться дружественными функциями так
Код:
friend MyClass operator+(char*str, MyClass obj);
и так
Код:
friend MyClass operator+(MyClass obj,char*str);
Если не секрет, что вы именно делаете? Просто если вы бы выложили наработки легче было бы исправить ошибку или неточность чем на пальцах объяснять.
profi вне форума Ответить с цитированием
Старый 13.07.2009, 16:40   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

А если написать не: n1 = 3 + n2;
а: n1 = n2 + 3;
не заработает случаем?
pu4koff вне форума Ответить с цитированием
Старый 13.07.2009, 17:42   #6
Karasu
Новичок
Джуниор
 
Регистрация: 13.07.2009
Сообщений: 4
По умолчанию

Класс для работы со строками наподобие AnsiString, только использующий Unicode (wchar_t вместо char).
Вот чего мне удалось добится:
Код:
UniString Str1(L"Число");
UniString Str2 = Str1+"равно "+12;
В результате в строке Str2 будет следующая запись: "Число равно 12".
Но если в самом начале вместо UniString будет любой другой тип, то программа не скомпилируется. Например такой код выдаст ошибку:
Код:
UniString Str2 = "Число равно "+12;
Конечно если написать глобальные функции операторов для всех вариантов то даже такой код скомпилируется, но вариантов довольно много (Использую типы char *, wchar_t *, (unsigned) int, (unsigned) __int64, double).
Karasu вне форума Ответить с цитированием
Старый 13.07.2009, 17:47   #7
Karasu
Новичок
Джуниор
 
Регистрация: 13.07.2009
Сообщений: 4
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
А если написать не: n1 = 3 + n2;
а: n1 = n2 + 3;
не заработает случаем?
Заработает, но это в данном случае можно поменять местами, а если вместо "+" будет "-".
Karasu вне форума Ответить с цитированием
Старый 13.07.2009, 18:04   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Значит надо писать friend'а, у которого int первый
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка операторов (С++) Перчитель Помощь студентам 1 03.12.2008 18:46
Значение операторов [ и ] Ivan_32 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 30.11.2008 15:50
Перегрузка операторов, Организация перегрузки операторов chagin_yav Помощь студентам 2 12.05.2008 09:15
Оптимизировать перегрузку операторов Иллидан Общие вопросы C/C++ 14 24.04.2008 11:18
Несовместимость двух операторов August550 Помощь студентам 16 23.04.2008 21:30