Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Maximum_001
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
1

Преобразование пользовательского типа в стандартный и обратно, перегрузка операторов

18.06.2016, 17:18. Просмотров 877. Ответов 12
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef INTEGER_H_
#define INTEGER_H_
 
class Integer{
public:
    Integer(int=0);
    ~Integer();
    Integer& operator++();
    Integer& operator++(int);
    int setInt();
 
    operator int();
private:
    int val;
};
#endif /* INTEGER_H_ */
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "Integer.h"
 
Integer::Integer(int a):val(a){
 
}
Integer::~Integer(){}
 
Integer& Integer::operator ++(){
    ++val;
    return *this;
}
Integer& Integer::operator++(int){
    Integer temp=*this;
    ++val;
    return temp;
}
int Integer::setInt(){
    int a=val;
    return a;
}
 
Integer::operator int(){
    int a=val;
    return a;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include "Integer.h"
using namespace std;
 
int main() {
    Integer Int=11;
    int a=Int.setInt();
    cout << "Integer="<<a<< endl;
    ++Int;
    a=Int.setInt();
    cout << "Integer="<<a<< endl;
    Int++;
    int b=Int;
    cout << "Integer="<<b<< endl;
    return 0;
}
Компилятор выдает: Description Resource Path Location Type
reference to local variable 'temp' returned [-Wreturn-local-addr] Integ.cpp /INTEGER/src line 19 C/C++ Problem

1. Я так понимаю он имеет ввиду то что объект Integer локален и после того выхода из функции оператора будет не доступен, как то можно это обойти?
2. В main строка Integer Int=11; почему она правильно работает ведь я не переопределял "=";
В integer.cpp правильно ли я написал возможность преобразования пользовательского типа Integer в int?

C++
1
2
3
4
Integer::operator int(){
    int a=val;
    return a;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2016, 17:18
Ответы с готовыми решениями:

Преобразование типа из пользовательского в стандартный и из стандартного в пользовательский
Уважаемые форумчане, нужна ваша помощь в этом вопросе про преобразовния типов. Где об этом...

Перегрузка operator<< для пользовательского типа
Переписал пример из учебника, но компилятор (visual 2017) выдает кучу ошибок. Добавлять...

Перегрузка операторов. Преобразование типов
Привет всем! Я относительно недавно начал программировать на с++. Изучаю его по книжке Лафоре и...

Преобразование пользовательского типа, friend
Этот код не работает, потому что класс X ничего не знает о классе Y? Ошибки:Error 5 error C2679:...

Перегрузка операторов и слияние строк типа char*
Доброго времени суток! Есть класс, для объектов которого перегружен оператор +. Класс представляет...

12
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
18.06.2016, 17:36 2
Цитата Сообщение от Maximum_001 Посмотреть сообщение
как то можно это обойти?
Не возвращать ссылку:
C++
1
2
3
4
Integer Integer::operator++(int)
{
//...
}
Добавлено через 1 минуту
Цитата Сообщение от Maximum_001 Посмотреть сообщение
почему она правильно работает ведь я не переопределял "=";
Хотя бы потому, что это не присваивание.
Здесь будет вызван конструктор копирования.
И конструктор копирования и оператор
присваивания автоматически генерируются компилятором.
0
Maximum_001
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
18.06.2016, 17:40  [ТС] 3
просто вначале не работало.

Добавлено через 56 секунд
Цитата Сообщение от Croessmah Посмотреть сообщение
Не возвращать ссылку:
C++Выделить код
1
2
3
4
Integer Integer::operator++(int)
{
//...
}
А что же тогда возвращать?
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
18.06.2016, 17:42 4
Лучший ответ Сообщение было отмечено Maximum_001 как решение

Решение

Цитата Сообщение от Maximum_001 Посмотреть сообщение
А что же тогда возвращать?
Не ссылку. Показано же в коде.
1
Maximum_001
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
18.06.2016, 17:42  [ТС] 5
понял надо вернуть сам объект! да?
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
18.06.2016, 17:42 6
Цитата Сообщение от Maximum_001 Посмотреть сообщение
понял надо вернуть сам объект!
Копию.
0
Maximum_001
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
18.06.2016, 17:45  [ТС] 7
Цитата Сообщение от Maximum_001 Посмотреть сообщение
В integer.cpp правильно ли я написал возможность преобразования пользовательского типа Integer в int?
C++Выделить код

Integer::operator int(){
* * int a=val;
* * return a;
}
Правильно ли это, я не до конца понимаю как это работает.
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
18.06.2016, 17:46 8
Достаточно будет
C++
1
return val;
0
Maximum_001
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
18.06.2016, 17:46  [ТС] 9
ПОЧЕМУ?
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
18.06.2016, 17:49 10
Цитата Сообщение от Maximum_001 Посмотреть сообщение
ПОЧЕМУ?
Тогда объясните, зачем необходима строчка
C++
1
int a=val;
0
Maximum_001
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
18.06.2016, 18:28  [ТС] 11
Я согласен что это бред, но тогда как int работает, получается переменная типа int вызывает оператор int (), который возвращает значение закрытой переменной объекта типа Integer. Получается так, хотя в описании operator возвращаемый тип вообще не указан, т.е. допустим int x=x.operator (int ()), так что ли?
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
18.06.2016, 18:52 12
Лучший ответ Сообщение было отмечено Maximum_001 как решение

Решение

Давайте тогда разберем что есть что вообще.
Для начала, удалим из нашего класса оператор преобразования к int.
Добавим функцию-член to_int к нашему классу.
C++
1
int to_int() const;
Всё что она будет делать - возвращать значение типа int.
Реализуем:
C++
1
2
3
int Integer::to_int() const {
   return val;//Возвращаем копию val
}
Таким образом получили функцию-член,
которая даст нам int, основываясь на данных объекта.
Там, где нам нужно будет преобразовать наш объект в int,
мы будем вызывать у объекта to_int:
C++
1
2
Integer myIntVar(11);
int value = myIntVar.to_int();//здесь у нас нечто вроде преобразования Integer в int
Как видим, для преобразования мы должны вызвать функцию-член to_int.
Если мы сделаем так:
C++
1
int value = myIntVar;
то получим ошибку, т.к. компилятор не знает как преобразовать объект типа Integer в int.
То бишь это место требует чего-то, что позволит компилятору сделать преобразование.
Вот здесь как раз и приходит на помощь наш operator int.
От функции to_int он отличается только лишь ничем.
Разве что немного непривычным синтаксисом.
C++
1
operator int() const;
Возвращаемое значение здесь определяется в имени самого оператора.
То есть в данном случае получается что-то вроде
C++
1
int operator int() const;
Но, первый int (возвращаемое значение) в таких операторах преобразования не указывается:
C++
1
2
3
operator int() const;
operator double() const;
//и т.д.
Так вот оно заведено в языке.
Реализуем сам оператор:
C++
1
2
3
Integer::operator int() const{
    return val;//так же как и в to_int возвращаем копию значения val
}
Теперь в местах, где требуется преобразование из Integer в int компилятор сможет его выполнить,
вызвав нашу функцию-член operator int.
C++
1
int value = myIntVar;//преобразование возможно, компилятор смог найти нужный вариант
Фактически, компилятор здесь сделает что-то вроде:
C++
1
int value = myIntVar.operator int();
т.е. проставит вызов нашей "функции - оператора преобразования" (оптимизации и т.д. в расчет не берем).

Вот как-то так.
Подытожим: операторы преобразования такие же функции-члены,
как и остальные, просто там не указывается возвращаемое значение
и компилятор в контексте преобразования будет сам использовать эти функции.
1
Maximum_001
1 / 1 / 0
Регистрация: 07.10.2015
Сообщений: 96
18.06.2016, 19:30  [ТС] 13
Спасибо Вам огромное!!!
0
18.06.2016, 19:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2016, 19:30

Реализовать перегрузку операторов сравнения для пользовательского типа "Обыкновенная дробь"
Структура. дробное сравнение 1. Создайте структуру дробей, состоящую из двух полей int-type ...

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в...

Можно ли присвоить объекту основного типа значение объекта пользовательского типа?
Правильно ли я понимаю, что SomeClass obj; int x = obj; или SomeClass obj; int x = 5 +...


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

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

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