![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
S3_ |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 14.10.2007 Репутация: нет Всего: нет |
Здравствуйте. Есть такая проблема. Класс complex с переменными real и imag, при перегрузкe friend double& operator= (const complex& c) что бы можно было присвоить типу Double свой тип Complex, вызывает ошибку operator= must be a non-static member. Вопрос заключается в том, как перегрузить знак "=" что бы Complex можно было присвоить какому либо типу (например тот же Double). Искал в интернете, толком ничего не нашел
![]()
Заранее спасибо за помощ ![]() Это сообщение отредактировал(а) S3_ - 8.9.2009, 00:45 |
||||
|
|||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
operator= не может быть friend.
он должен быть определён внутри класса. *** можно определить свой оператор преобразования в тип double.
Это сообщение отредактировал(а) zim22 - 7.9.2009, 20:55 |
|||
|
||||
ller |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.8.2008 Где: г. Таганрог Репутация: 2 Всего: 4 |
Из этого все равно ничего не выйдет. Компилятор в выражении d = c всегда будет пытаться преобразовать класс complex в double.
Причем средствани объекта double... А он ничего не подозревает о существовании complex |
|||
|
||||
zim22 |
|
||||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
![]()
Это сообщение отредактировал(а) zim22 - 7.9.2009, 21:10 |
||||
|
|||||
ller |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.8.2008 Где: г. Таганрог Репутация: 2 Всего: 4 |
Обратное же работает
|
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
||||
|
||||
ller |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.8.2008 Где: г. Таганрог Репутация: 2 Всего: 4 |
Хотя да. Оператор преобразования типа работает....
![]() Добавлено через 45 секунд
|
|||
|
||||
S3_ |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 14.10.2007 Репутация: нет Всего: нет |
Ура, работает этот оператор преобразования типа. Спасибо, я о нем думал как раз, вот только не знал как правильно реализовать
![]() ![]() Спасибо за помощ ![]() |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Но не стоит переусердствовать с "пользовательскими" преобразаованиями. Так же надо помнить, что больше двух "пользовательских" преобразований за раз не допустимо. P.S. Конструкторы, с одним аргументом, тоже "пользовательское" преобразование. Это сообщение отредактировал(а) Леопольд - 8.9.2009, 18:19 -------------------- вопросов больше чем ответов |
|||
|
||||
IKM2007 |
|
||||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: 3 Всего: 40 |
Да и вообще не рекомендуется, так-как может привести к затруднениям, о которых вы и не можете подозревать. Например, для класса Complex вы должны были обьявить оператор <<, чтобы напечатать число так: "(a, b)", но забыли определить оператор <<. Однако после компиляции увидели, что следующий код "работает":
На самом деле компилятор не находит обьявленный оператор << для аргумента типа Complex, и пытается найти последовательность операторов неявного преобразования, чтобы вызвать оператор <<, и находит приведение к типу double, затем уже вызывает operator << для double. То есть мы вызвали не ту функцию, которую хотели бы вызвать, а это не хорошо. ![]() -------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
||||
|
|||||
Леопольд |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Больше одного, а не двух! Добавлено через 46 секунд
Если конечно он не объявлен как explicit -------------------- вопросов больше чем ответов |
||||
|
|||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Я бы так не сказал, всё можно пользовать, только надо подходить правильно... Иногда это ОЧЕНЬ удобно, и вполне безопасно.
Это сообщение отредактировал(а) Леопольд - 8.9.2009, 20:45 -------------------- вопросов больше чем ответов |
|||
|
||||
IKM2007 |
|
||||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: 3 Всего: 40 |
Леопольд, Вы что спорите с самим собой? -------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
||||
|
|||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Добавлено через 2 минуты и 6 секунд В споре рождается истина ![]() Я просто поправил сам себя. Что бы не вводить никого в заблуждение. -------------------- вопросов больше чем ответов |
|||
|
||||
IKM2007 |
|
||||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: 3 Всего: 40 |
Да, но врядли автор топика знает про proxy-классы, если задает такой вопрос. ![]()
-------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |