Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Для новичков > Приведение ко встроенному типу |
Автор: S3_ 7.9.2009, 20:01 | ||||
Здравствуйте. Есть такая проблема. Класс complex с переменными real и imag, при перегрузкe friend double& operator= (const complex& c) что бы можно было присвоить типу Double свой тип Complex, вызывает ошибку operator= must be a non-static member. Вопрос заключается в том, как перегрузить знак "=" что бы Complex можно было присвоить какому либо типу (например тот же Double). Искал в интернете, толком ничего не нашел ![]()
Заранее спасибо за помощ ![]() |
Автор: zim22 7.9.2009, 20:45 | ||
operator= не может быть friend. он должен быть определён внутри класса. *** можно определить свой оператор преобразования в тип double.
|
Автор: ller 7.9.2009, 21:04 |
Из этого все равно ничего не выйдет. Компилятор в выражении d = c всегда будет пытаться преобразовать класс complex в double. Причем средствани объекта double... А он ничего не подозревает о существовании complex |
Автор: ller 7.9.2009, 21:11 | ||
Обратное же работает
|
Автор: Anikmar 7.9.2009, 21:15 |
![]() ![]() |
Автор: ller 7.9.2009, 21:16 | ||
Хотя да. Оператор преобразования типа работает.... ![]() Добавлено через 45 секунд
|
Автор: S3_ 8.9.2009, 00:43 |
Ура, работает этот оператор преобразования типа. Спасибо, я о нем думал как раз, вот только не знал как правильно реализовать ![]() ![]() Спасибо за помощ ![]() |
Автор: Леопольд 8.9.2009, 18:07 |
Но не стоит переусердствовать с "пользовательскими" преобразаованиями. Так же надо помнить, что больше двух "пользовательских" преобразований за раз не допустимо. P.S. Конструкторы, с одним аргументом, тоже "пользовательское" преобразование. |
Автор: IKM2007 8.9.2009, 18:58 | ||||
Да и вообще не рекомендуется, так-как может привести к затруднениям, о которых вы и не можете подозревать. Например, для класса Complex вы должны были обьявить оператор <<, чтобы напечатать число так: "(a, b)", но забыли определить оператор <<. Однако после компиляции увидели, что следующий код "работает":
На самом деле компилятор не находит обьявленный оператор << для аргумента типа Complex, и пытается найти последовательность операторов неявного преобразования, чтобы вызвать оператор <<, и находит приведение к типу double, затем уже вызывает operator << для double. То есть мы вызвали не ту функцию, которую хотели бы вызвать, а это не хорошо. ![]() |
Автор: Леопольд 8.9.2009, 19:16 | ||||
Больше одного, а не двух! Добавлено через 46 секунд
Если конечно он не объявлен как explicit |
Автор: Леопольд 8.9.2009, 19:41 | ||
Я бы так не сказал, всё можно пользовать, только надо подходить правильно... Иногда это ОЧЕНЬ удобно, и вполне безопасно.
|
Автор: IKM2007 8.9.2009, 19:43 | ||||
Леопольд, Вы что спорите с самим собой? |
Автор: Леопольд 8.9.2009, 19:44 | ||
Добавлено через 2 минуты и 6 секунд В споре рождается истина ![]() Я просто поправил сам себя. Что бы не вводить никого в заблуждение. |
Автор: IKM2007 8.9.2009, 19:49 | ||||
Да, но врядли автор топика знает про proxy-классы, если задает такой вопрос. ![]()
|
Автор: bsa 8.9.2009, 23:22 |
Если не ошибаюсь, простое преобразование complex -> double в принципе невозможно. Так как действительное число - частный случай комплексного (мнимая часть равна нулю). Введение подобного преобразования ведет к увеличению вероятности ошибки при программировании. По хорошему, программист (пользователь класса) должен себе полностью отдавать отчет, когда делает такое преобразование. Поэтому подобные преобразования наоборот усложняют (чтобы было видно, что именно делается в данной строке)! |
Автор: S3_ 9.9.2009, 18:49 | ||||||
Я их перегрузил (в самом первом моем сообщении строчка кода номер "7")
Угу, не знаю ![]()
Да, я писал этот класс, и возникла вот такой вот вопрос, как его присвоить, например, double... Так что присваивать double только значение real неправильно. ![]() |
Автор: bsa 9.9.2009, 20:03 |
S3_, я с точки зрения математики высказался: вещественный числа - это подобласть пространства комплексных чисел. Т.е. комплексное число содержит больше информации, чем действительное. Даже компилятор, когда ты присваиваешь переменную более точного типа менее точному (float = double или char = int, например), всегда выдасть предупреждение. А ты делаешь конвертацию. Повторяю, с точки зрения правильного проектирования класса, это делать нельзя. |
Автор: Леопольд 9.9.2009, 20:14 | ||
В данном случае это не важно, я имел ввиду что пользовательские преобразования типов надо исользовать только там где необходимо и таким образом, чтобы ни у кого не вызывало недоумение неожиданное поведение программы. Эти преобразования иногда сложно заметить в ходе выполнения программы. Вообще, надо пытаться программировать так, чтобы можно было держать в голове как можно меньше деталей работы отдельных частей программы и не боятся при этом совершить обшибку. |
Автор: IKM2007 10.9.2009, 14:38 | ||
Я не говорил именно о твоем примере. |
Автор: choiming 11.9.2009, 12:09 |
да конечно очень нужная вещь |
Автор: S3_ 12.9.2009, 13:05 | ||||
Я это знаю и придерживаюсь этого же мнения, ты наверное меня на так понял ![]() ![]() ![]()
Ой, сорри, не допонял ![]() |