Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
12.07.2010, 21:24     Как определить конверсию к типу? #1
Заранее извиняюсь за ужасное название темы, но ничего другого придумать не смог.
У меня есть свой класс(пусть зовется 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'е про это ни слова...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2010, 21:24     Как определить конверсию к типу?
Посмотрите здесь:

что происходит со старым конструктором когда я создаю новый, пренадлежащий производному типу? (первый конструктор пренадлежит базовому типу) C++
Как узнать расширение по типу MIME? C++
Вопросы по типу char C++
Алгоритм по типу экселевского vlookup. Посоветуйте, как скомпоновать 2 файлика C++
C++ Как в условии поставить проверку принадлежности к тому или иному типу?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
12.07.2010, 22:38     Как определить конверсию к типу? #2
C++
1
2
3
4
5
6
7
class MyInt {
public:
    MyInt(int val=0): data(val) {}
    operator int () const {return data;}    // Оператор преобразования в int
private:
    int data;
};
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
12.07.2010, 22:41     Как определить конверсию к типу? #3
Цитата Сообщение от Nick Alte Посмотреть сообщение
operator int () const {return data;}
наверное
C++
1
int operator () const { return data; }
?
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
12.07.2010, 22:51  [ТС]     Как определить конверсию к типу? #4
Цитата Сообщение от Nick Alte Посмотреть сообщение
C++
1
2
3
4
5
6
7
class MyInt {
public:
    MyInt(int val=0): data(val) {}
    operator int () const {return data;}    // Оператор преобразования в int
private:
    int data;
};
Спасибо, но я в этом коде ничего не понял. Не мог бы ты его прокомментировать?(только третью и четвертую строчки, присутствующий "комментарий" четвертой ничего не поясняет...)
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.07.2010, 23:17     Как определить конверсию к типу? #5
подразумевается вызов этого оператора, когда объект находится в контексте, требующего int
типа int = int * (int)MY;



Цитата Сообщение от Bazan Посмотреть сообщение
MyInt(int val=0): data(val) {} //просто конструктор для удобства
operator int () const {return data;} // Оператор преобразования в int при (int)MyInt
______________
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
12.07.2010, 23:32     Как определить конверсию к типу? #6
Nick Alte, а для чего метод/оператор преобразования делать константным?
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
12.07.2010, 23:34  [ТС]     Как определить конверсию к типу? #7
Цитата Сообщение от easybudda Посмотреть сообщение
наверное
C++
1
int operator () const { return data; }
?
Все таки у Nick Alte правильно. Твой вариант не работает.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
12.07.2010, 23:35     Как определить конверсию к типу? #8
Константным надо делать всё, что только можно. По смыслу, такой оператор не изменяет сам объект, а создаёт новое значение другого типа на основе существующего. То есть, он константный. Как практическое следствие, такой оператор сможет преобразовывать константные объекты.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
12.07.2010, 23:39     Как определить конверсию к типу? #9
Цитата Сообщение от Bazan Посмотреть сообщение
Все таки у Nick Alte правильно. Твой вариант не работает.
Только const не надо.

Добавлено через 3 минуты
Nick Alte, все делать константным это конечно может и хорошо, когда ты разрабатываешь свой код. Но вид операторов неявного преобразования явно описан в стандарте без всякого const. Посему нужно придерживатся стандарта, а не брать что-то из головы.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
12.07.2010, 23:39     Как определить конверсию к типу? #10
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Только const не надо.
Таки надо.
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
12.07.2010, 23:40  [ТС]     Как определить конверсию к типу? #11
С конверсией "MY" в int\float\double разобрался. Теперь вопрос: как сделать наоборот? Т.е. из int\float\double сделать "MY"?
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
12.07.2010, 23:42     Как определить конверсию к типу? #12
Определи конструктор из нужного или неявно приводимого к нужного типа (а лучше - несколько).
C++
1
2
MyInt(float val): data(static_cast<int>(val)) {}
MyInt(double val): data(static_cast<int>(val)) {}
Конструктор из int уже был в моём примере.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
12.07.2010, 23:45     Как определить конверсию к типу? #13
Цитата Сообщение от Bazan Посмотреть сообщение
Все таки у Nick Alte правильно. Твой вариант не работает.
ещё как работает, только там ещё пары скобок не хватает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
 
class MyInt {
public:
    MyInt(int val=0): data(val) {}
    int operator () () const {return data;}    // Оператор преобразования в int
private:
    int data;
};
 
int main() {
    MyInt mi1(25);
    MyInt mi2(15);
 
    std::cout << mi1() << " + " << mi2() << " = " << ( mi1() + mi2() ) << std::endl;
    return 0;
}
Как определить конверсию к типу?
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
12.07.2010, 23:48     Как определить конверсию к типу? #14
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Nick Alte, все делать константным это конечно может и хорошо, когда ты разрабатываешь свой код. Но вид операторов неявного преобразования явно описан в стандарте без всякого const. Посему нужно придерживатся стандарта, а не брать что-то из головы.
Это какое-то нелепое идолопоклонство. Операторы преобразования могут быть как const, так и неконстантными. Но обычно имеет смысл определять их именно как константные по описанным мною выше причинам. Неконстантные операторы преобразования нужны только в весьма специальных и особенных случаях, когда они реально с какими-то хитрыми целями нарушают константность объекта.

Добавлено через 2 минуты
Цитата Сообщение от easybudda Посмотреть сообщение
ещё как работает, только там ещё пары скобок не хватает
Это оператор вызова функции, (), а не оператор преобразования типа. А вот если бы преобразование типа было написано правильно, ты мог бы написать такое:
C++
1
 std::cout << mi1 << " + " << mi2 << " = " << ( mi1 + mi2 ) << std::endl;
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
13.07.2010, 00:12     Как определить конверсию к типу? #15
Цитата Сообщение от Nick Alte Посмотреть сообщение
Это какое-то нелепое идолопоклонство.
Следование стандарту - это глупое идолопоклонство? Интересная позиция. Так может ну его, стандрат, будем отсебятину лепить?
Цитата Сообщение от Nick Alte Посмотреть сообщение
Как практическое следствие, такой оператор сможет преобразовывать константные объекты.
Это единственная причина при необходимости сделать оператор константным. Подчеркиваю, при необходимости.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
13.07.2010, 00:41     Как определить конверсию к типу? #16
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Следование стандарту - это глупое идолопоклонство? Интересная позиция. Так может ну его, стандрат, будем отсебятину лепить?

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

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

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

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

Чему могло бы послужить столь нелепое ограничение на константность операторов преобразования? Ничему, смысла в таком ограничении нет совершенно никакого, и даже более того - оно противоречит практике хорошего программирования. Мы имеем пример других операторов (например, арифметических), которые также можно делать по выбору константными или нет. И операции, производящие новое значение, вроде + и -, как раз-таки обычно делают константными. Придерживаться противоречащих здравому смыслу домыслов исключительно из-за веры в Непостижимое Высшее Благо Стандарта и неправильно понятой строчки кода, в моей интерпретации и есть фетишизм и идолопоклонство.
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
13.07.2010, 12:04  [ТС]     Как определить конверсию к типу? #17
Возник еще вопрос:
Математические операции у меня реализованы функциями т.е.
MY.addition(&MY,&MY);
а хочется, чтобы выглядело так:
MY=MY+MY;
Как это можно реализовать?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 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 {
    // Логика сложения
  }
  //...
};
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 {
    // Логика сложения
  }
  //...
};
Уже работает. Теперь надо разбираться с логикой .
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2010, 15:58     Как определить конверсию к типу?
Еще ссылки по теме:

C++ Как присвоить типу char значение string?
C++ как в c++ проверить пренадлежит ли переменная определенному типу?
C++ Выражение должно относиться к целочисленному типу или типу перечисления без области видимости

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

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 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);   // Ничего сложного...
}
Yandex
Объявления
13.07.2010, 15:58     Как определить конверсию к типу?
Ответ Создать тему
Опции темы

Текущее время: 06:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru