Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
#1

Как определить конверсию к типу? - C++

12.07.2010, 21:24. Просмотров 1620. Ответов 22
Метки нет (Все метки)

Заранее извиняюсь за ужасное название темы, но ничего другого придумать не смог.
У меня есть свой класс(пусть зовется MY), который реализует математические действия(умножение, деление, извлечение квадратного корня и т.д.) с большой точностью. Если сделать выполнить следующую строчку(вместо переменных написаны их типы и на месте * может быть любой другой оператор):
int=int*MY;
То компилятор выдаст ошибку C2677, что естественно.
На MSDN'е написано:
"To use the operator, you must overload it for the specified type or define a conversion to a type for which the operator is defined."
Меня интересует второе т.е. define a conversion to a type for which the operator is defined. Вопрос в том, как это сделать? На MSDN'е про это ни слова...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2010, 21:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как определить конверсию к типу? (C++):

Как определить тип возвращаемого значения шаблонной функции по типу итератора (не auto)? - C++
Здравствуйте. Есть шаблонная функция (например, суммирования). Входные значения два итератора -- начало конец. template <typename...

Выражение должно относиться к целочисленному типу или типу перечисления без области видимости - C++
Добрый день,столкнулся с проблемой "Выражение должно относиться к целочисленному типу или типу перечисления без области видимости" в такой...

Выражение должно относиться к целочисленному типу или типу перечисления без области видимости - C++
#include <iostream> #include <cmath> using namespace std; int main() { int N; double Y = 0; setlocale(0,""); cout <<...

2IntelliSense: выражение должно относиться к целочисленному типу или типу перечисления без области видимости - C++
"Выражение должно относиться к целочисленному типу или типу перечисления без области видимости" Что это за ошибка такая и как ее исправить?...

что происходит со старым конструктором когда я создаю новый, пренадлежащий производному типу? (первый конструктор пренадлежит базовому типу) - C++
1) что происходит со старым конструктором когда я создаю новый, пренадлежащий производному классу? (первый конструктор пренадлежит базовому...

Как узнать расширение по типу MIME? - C++
Народ, есть ли стандартная функция или какой способ узнавания расширеня по типу MIME. Например, если в заголовке ответа сервера тип ...

22
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
13.07.2010, 00:41 #16
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Следование стандарту - это глупое идолопоклонство? Интересная позиция. Так может ну его, стандрат, будем отсебятину лепить?

Это единственная причина при необходимости сделать оператор константным. Подчеркиваю, при необходимости.
Нелепым идолопоклонством я называю неспособность осмысливать то, что написано в стандарте и бездумное отношение "я видел такую строчку в стандарте и поэтому буду писать только так!".

Стандарт предусмотрел возможность делать как константные методы (а операторы, безусловно, являются частным случаем обыкновенных методов), так и не константные. Стандарт не предписывает делать операторы преобразования неконстантными, а допускает оба варианта, в том числе и одновременно. То есть, можно вообще сделать сразу два оператора преобразования в один и тот же тип, один из которых константный, а другой - нет.

А общие рекомендации по стилю программирования как раз-таки очень советуют делать константным всё, что возможно. И возможность преобразовывать константное значение к другому типу более чем целесообразна и пренебрегать этими рекомендациями только из-за фетишистского отношения к виденным в стандарте примерам нелепо.

Добавлено через 17 минут
Поясню, почему я называю такое отношение идолопоклонничеством и фетишизмом.
Стандарт разрабатывает комитет, состоящий из опытных и умелых специалистов. Каждый пункт имеет какую-то цель, обычно вполне очевидную. Пример: Почему нельзя делать статические методы const? Потому что это не имеет смысла, ведь статические методы не применяются к конкретному экземпляру объекта. Разработчики стандарта - не небожители, вращающие тайныя колёса, и исходят из вполне доступных для понимания соображений.

Чему могло бы послужить столь нелепое ограничение на константность операторов преобразования? Ничему, смысла в таком ограничении нет совершенно никакого, и даже более того - оно противоречит практике хорошего программирования. Мы имеем пример других операторов (например, арифметических), которые также можно делать по выбору константными или нет. И операции, производящие новое значение, вроде + и -, как раз-таки обычно делают константными. Придерживаться противоречащих здравому смыслу домыслов исключительно из-за веры в Непостижимое Высшее Благо Стандарта и неправильно понятой строчки кода, в моей интерпретации и есть фетишизм и идолопоклонство.
2
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
13.07.2010, 12:04  [ТС] #17
Возник еще вопрос:
Математические операции у меня реализованы функциями т.е.
MY.addition(&MY,&MY);
а хочется, чтобы выглядело так:
MY=MY+MY;
Как это можно реализовать?
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
13.07.2010, 12:15 #18

Не по теме:

Nick Alte, язык определяется стандартом, который, как ты заметил, разрабатывали далеко не глупые люди, посему стандарта стоит придерживатся. Никакого слепого идолопоклонства в этом нет.

Делая оператор преобразования константным ты позволяешь безмолвно преобразовать объект одного типа в объект другого типа, не смотря на то констатные они или нет, в том числе константу в неконстанту. В радавляющем большинстве случаев это не вызовет никаких проблем, но стоит ли предотавлять такую возможность без необходимости?

На мой вопрос о причине константности оператора, ты ответил, что все, что возможно, нужно делать константным. Разве это нельзя назвать идолопоклонством?


Цитата Сообщение от Bazan Посмотреть сообщение
Как это можно реализовать?
Тебе необходимо реализовать оператор сложения:
C++
1
2
3
4
5
6
7
class MY {
  //...
  MY operator+(const MY& right) const {
    // Логика сложения
  }
  //...
};
1
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
13.07.2010, 12:27  [ТС] #19
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Тебе необходимо реализовать оператор сложения:
C++
1
2
3
4
5
6
7
class MY {
  //...
  MY operator+(const MY& right) const {
    // Логика сложения
  }
  //...
};
Уже работает. Теперь надо разбираться с логикой .
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
13.07.2010, 15:58 #20

Не по теме:

Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Nick Alte, язык определяется стандартом, который, как ты заметил, разрабатывали далеко не глупые люди, посему стандарта стоит придерживатся. Никакого слепого идолопоклонства в этом нет.
Не придерживаться стандарта просто не получится: компилятор не даст (вопрос специфических для компилятора расширений оставим за бортом, едва ли отклоняющийся от стандарта код случайно совпадёт с расширением). В том, чтобы придерживаться стандарта, действительно нет слепого идолопоклонства. Оно есть в том, чтобы придерживаться нелепых и неверных трактовок стандарта без малейших попыток осмысления.

Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Делая оператор преобразования константным ты позволяешь безмолвно преобразовать объект одного типа в объект другого типа, не смотря на то констатные они или нет, в том числе константу в неконстанту.
Смысл оператора преобразования в том, что он порождает новое значение другого типа, никоим образом не изменяя старого. И порождаться это значение может и из константных, и из неконстантных объектов. То есть, метод явно константный и так его и следует определять. Придавать ему другой смысл нужно крайне редко в силу очень особых необходимостей и то с оговорками в документации.

Цитата Сообщение от CyBOSSeR Посмотреть сообщение
На мой вопрос о причине константности оператора, ты ответил, что все, что возможно, нужно делать константным. Разве это нельзя назвать идолопоклонством?
Нельзя, потому что у этой рекомендации есть рациональные причины. Следование ей позволяет более явно и формализованно выражать свой замысел и позволит компилятору выявлять ряд потенциальных ошибок. Модификатор const для этого и придумывался и Страуструп поясняет, что его "вирусообразное распространение по коду" (то есть, то же самое, о чём я и говорил: константным делается всё, что возможно) соответствует замыслу.




Цитата Сообщение от Bazan Посмотреть сообщение
Теперь надо разбираться с логикой
Логика очень простая. Оператор сложения порождает новое значение и возвращает его по значению. Поскольку он не изменяет значения своих операндов, он является const-методом, каковых рекомендаций и придерживается приведённая CyBOSSeR сигнатура.
C++
1
2
3
4
MyInt MyInt::operator + (const MyInt& op2) const
{
    return MyInt(data + op2.data);   // Ничего сложного...
}
0
CyBOSSeR
13.07.2010, 23:07
  #21

Не по теме:

Nick Alte, ладно, споры о стандарте оставим.

Цитата Сообщение от Nick Alte Посмотреть сообщение
Смысл оператора преобразования в том, что он порождает новое значение другого типа, никоим образом не изменяя старого.
Если рассматривать оператор преобразования в данном контексте, согласен, его стоит сделать констанным. Но операторы преобразования используются и в другой ситуации, а именно, для неявного предоставления доступа к внутреннему объекту. Различного рода умные указатели, обертки и т.п. используют операторы преобразования именно в этом контексте.
Цитата Сообщение от Nick Alte Посмотреть сообщение
то есть, то же самое, о чём я и говорил: константным делается всё, что возможно
Вот с этим не могу согласится . Константным нужно делать то, что нужно, а не, то что можно. Все зависит от контракта реализуемого объектом. Если в соответствии с контрактом принимаемый в качестве аргумента объект, не должен изменить своего состояния - мы должны это явно указать с помощью const. Также если при выполнении метода объект не должен изменить своего состояниям, мы опять же явно это указываем делая метод константным.
Ключевое слово const, по-моему мнению, в первую очередь должно быть атрибутом контракта, а не "защитой от дурака".

0
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
14.07.2010, 11:45  [ТС] #22
Возник еще вопрос, на этот раз не по теме:
Есть массив переменных типа short, а первый(нулевой) его член надо сделать типа long... Сделать их раздельно не представляется возможным - иначе придется вносить значительные изменения в алгоритмы...
0
Nick Alte
14.07.2010, 12:03     Как определить конверсию к типу?
  #23

Не по теме:

Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Но операторы преобразования используются и в другой ситуации, а именно, для неявного предоставления доступа к внутреннему объекту.
И что с того? Как это нарушает следование рекомендации? Нам рекомендуют ставить const везде, где можно, а делать такой оператор доступа константным нельзя. Разумеется, термины "можно" и "нельзя" рассматриваются в контексте смысла операции - то есть, может ли операция изменять внутреннее состояние объекта. В рамках концепции обёртки она является владельцем объекта, к которому осуществляется доступ и изменение состояние объекта означает и изменение состояния обёртки (не физически, но по смыслу, в соответствии с замыслом обёртки).
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Ключевое слово const, по-моему мнению, в первую очередь должно быть атрибутом контракта, а не "защитой от дурака".
Так суть рекомендации как раз в том, чтобы стремиться выбирать константный контракт всегда, за исключением тех случаев, когда смысл операции заключается в изменении состояния объекта.

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2010, 12:03
Привет! Вот еще темы с ответами:

Как адрес IP перевели к типу int 32 - C++
Добрый день. Прошу помощи во следующему вопросу: Изучаю программу по передачи данных клиент-сервис. Для настройки пересылки в...

Как присвоить типу char значение string? - C++
При выполнении строки w.at(1)=l; выдает error2440 cannot convert from std::string to char как перевести l в char или w.at в...

как в c++ проверить пренадлежит ли переменная определенному типу? - C++
Например, что бы если пользователь ввел не число а символ, то в консоль выводилось сообщение об ошибке.

Алгоритм по типу экселевского vlookup. Посоветуйте, как скомпоновать 2 файлика - C++
Hi all. Думаю, как лучше сделать следующее (понятно, что можно в Excel'е через vlookup, а как программно?) в общем, есть колонка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
14.07.2010, 12:03
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru