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

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

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

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

12.07.2010, 21:24. Просмотров 1630. Ответов 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
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 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;
};
1
easybudda
Модератор
Эксперт CЭксперт С++
9699 / 5649 / 964
Регистрация: 25.07.2009
Сообщений: 10,871
12.07.2010, 22:41 #3
Цитата Сообщение от Nick Alte Посмотреть сообщение
operator int () const {return data;}
наверное
C++
1
int operator () const { return data; }
?
0
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;
};
Спасибо, но я в этом коде ничего не понял. Не мог бы ты его прокомментировать?(только третью и четвертую строчки, присутствующий "комментарий" четвертой ничего не поясняет...)
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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
______________
1
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
12.07.2010, 23:32 #6
Nick Alte, а для чего метод/оператор преобразования делать константным?
0
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
12.07.2010, 23:34  [ТС] #7
Цитата Сообщение от easybudda Посмотреть сообщение
наверное
C++
1
int operator () const { return data; }
?
Все таки у Nick Alte правильно. Твой вариант не работает.
0
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
12.07.2010, 23:35 #8
Константным надо делать всё, что только можно. По смыслу, такой оператор не изменяет сам объект, а создаёт новое значение другого типа на основе существующего. То есть, он константный. Как практическое следствие, такой оператор сможет преобразовывать константные объекты.
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
12.07.2010, 23:39 #9
Цитата Сообщение от Bazan Посмотреть сообщение
Все таки у Nick Alte правильно. Твой вариант не работает.
Только const не надо.

Добавлено через 3 минуты
Nick Alte, все делать константным это конечно может и хорошо, когда ты разрабатываешь свой код. Но вид операторов неявного преобразования явно описан в стандарте без всякого const. Посему нужно придерживатся стандарта, а не брать что-то из головы.
0
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
12.07.2010, 23:39 #10
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Только const не надо.
Таки надо.
0
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
12.07.2010, 23:40  [ТС] #11
С конверсией "MY" в int\float\double разобрался. Теперь вопрос: как сделать наоборот? Т.е. из int\float\double сделать "MY"?
0
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 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 уже был в моём примере.
1
easybudda
Модератор
Эксперт CЭксперт С++
9699 / 5649 / 964
Регистрация: 25.07.2009
Сообщений: 10,871
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;
}
Как определить конверсию к типу?
0
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
12.07.2010, 23:48 #14
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Nick Alte, все делать константным это конечно может и хорошо, когда ты разрабатываешь свой код. Но вид операторов неявного преобразования явно описан в стандарте без всякого const. Посему нужно придерживатся стандарта, а не брать что-то из головы.
Это какое-то нелепое идолопоклонство. Операторы преобразования могут быть как const, так и неконстантными. Но обычно имеет смысл определять их именно как константные по описанным мною выше причинам. Неконстантные операторы преобразования нужны только в весьма специальных и особенных случаях, когда они реально с какими-то хитрыми целями нарушают константность объекта.

Добавлено через 2 минуты
Цитата Сообщение от easybudda Посмотреть сообщение
ещё как работает, только там ещё пары скобок не хватает
Это оператор вызова функции, (), а не оператор преобразования типа. А вот если бы преобразование типа было написано правильно, ты мог бы написать такое:
C++
1
 std::cout << mi1 << " + " << mi2 << " = " << ( mi1 + mi2 ) << std::endl;
1
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
13.07.2010, 00:12 #15
Цитата Сообщение от Nick Alte Посмотреть сообщение
Это какое-то нелепое идолопоклонство.
Следование стандарту - это глупое идолопоклонство? Интересная позиция. Так может ну его, стандрат, будем отсебятину лепить?
Цитата Сообщение от Nick Alte Посмотреть сообщение
Как практическое следствие, такой оператор сможет преобразовывать константные объекты.
Это единственная причина при необходимости сделать оператор константным. Подчеркиваю, при необходимости.
0
13.07.2010, 00:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2010, 00:12
Привет! Вот еще темы с ответами:

Как адрес 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, а как программно?) в общем, есть колонка...


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

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

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