Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
28 / 20 / 11
Регистрация: 10.02.2016
Сообщений: 237

Перегрузка оператора float()

06.03.2016, 16:43. Показов 3550. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю упражнение на перегрузку оператору *

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// frengl.cpp
// Дружественная перегружаемая операция +
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
class Distance // Класс английских расстояний
{
private:
int feet;
float inches;
public:
Distance() // конструктор без аргументов
{ feet = 0; inches = 0.0; }
Distance(float fltfeet) // конструктор (1 арг.)
{ // Переводит float в Distance
feet = int(fltfeet); // feet - целая часть
inches = 12*(fltfeet - feet);// слева - дюймы
}
Distance(int ft, float in) // конструктор (2 арг.)
{ feet = ft; inches = in; }
void showdist() // Вывести длину
{ cout << feet << "\'-" << inches << '"'; }
friend Distance operator+(Distance, Distance); // дружественный
//operator float(){return float(feet+inches/12);}
};
//---------------------------------------------------------
Distance operator+(Distance d1, Distance d2) // d1 + d2
{
int f = d1.feet + d2.feet; // + футы
float i = d1.inches + d2.inches; // + дюймы
if(i >= 12.0) // если больше 12 дюймов,
{ i -= 12.0; f++; } // уменьшить на 12 дюймов,
// прибавить 1 фут
return Distance(f, i); // Новая длина с суммой
}
//---------------------------------------------------------
int main()
{
Distance d1 = 2.5; // конструктор переводит
Distance d2 = 1.25; // float-feet в Distance
Distance d3;
cout << "\nd1 = "; d1.showdist();
cout << "\nd2 = "; d2.showdist();
d3 = d1 + 10.0; // distance + float: OK
cout << "\nd3 = "; d3.showdist();
d3 = 10.0 + d1; // float + Distance: OK
cout << "\nd3 = "; d3.showdist();
cout << endl;
return 0;
}
хотел перегрузить float(), чтобы проще умножать было, но когда ввёл его, то начались проблемы с 44 строкой, подскажите в чём дело
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.03.2016, 16:43
Ответы с готовыми решениями:

Перегрузка оператора
Помогите, товарищи, пожалуйста. пытаюсь перегрузить оператор для того, чтобы можно было складывать матрицы. Не могу понять, где в программе...

Перегрузка оператора =
Здравствуйте, возникла проблема при перегрузке оператора. const digit &amp;operator=( const int &amp; ); const digit &amp;operator=(...

Перегрузка оператора
Здравствуйте. Нужна помощь) Есть такой класс: class vect { public: float *items; vect() { items = new float; for(int...

21
BrainOverflow
 Аватар для sab1ch
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
06.03.2016, 16:48
Лучший ответ Сообщение было отмечено Joey Black как решение

Решение

Joey Black, во-первых, тут нет перегрузки *.
во-вторых, это упражнение на перегрузку +.

Не по теме:

Сам читал Лафоре, ой, как же меня тошнит от этого класса Distance :)

0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
06.03.2016, 16:52
Цитата Сообщение от Joey Black Посмотреть сообщение
d3 = d1 + 10.0; // distance + float: OK
Ошибка потому, что перезружено исключительно obj + obj.
А ты подаешь obj + float.
Цитата Сообщение от Joey Black Посмотреть сообщение
Distance operator+(Distance d1, Distance d2)
0
BrainOverflow
 Аватар для sab1ch
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
06.03.2016, 16:53
SuperKir, нет там ошибки.
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
06.03.2016, 16:54
Sabnik18, Да ладно? Как так то?)
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
06.03.2016, 16:57
Joey Black, компилятор разве не пишет в чём проблема?
Не может из двух перегрузок выбрать:
error C2666: operator +: для 2 перегрузок есть подобные преобразования
1> e:\myprojects\build\main.cpp(56): может быть "Distance operator +(Distance,Distance)"
1> или "встроенный оператор C+++(float, double)"
1> при попытке сопоставить список аргументов "(Distance, double)"
0
BrainOverflow
 Аватар для sab1ch
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
06.03.2016, 16:59
У меня вообще никаких ошибок нет.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
06.03.2016, 16:59
C++
1
d3 = d1 + 10.0; // distance + float или float + double
0
BrainOverflow
 Аватар для sab1ch
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
06.03.2016, 17:00
Вот.
Миниатюры
Перегрузка оператора float()  
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
06.03.2016, 17:01
Sabnik18, кстати да, сам в шоке... не понимаю, почему так оО
Но и ответ конечно чудной, проверять желания нет.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
06.03.2016, 17:01
Цитата Сообщение от Sabnik18 Посмотреть сообщение
У меня вообще никаких ошибок нет.
С этим?
C++
1
operator float(){return float(feet+inches/12);}
0
BrainOverflow
 Аватар для sab1ch
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
06.03.2016, 17:03
nd2, а, так автору с этим надо?
Цитата Сообщение от nd2 Посмотреть сообщение
С этим?
"С этим" если так, то ошибок нет все равно:
C++
1
2
3
4
    d3 = float(d1) + 10.0; // distance + float: OK
    cout << "\nd3 = "; d3.showdist();
    d3 = 10.0 + float(d1); // float + Distance: OK
    cout << "\nd3 = "; d3.showdist();
или так:
C++
1
2
3
4
    d3 = float(d1) + 10.0; // distance + float: OK
    cout << "\nd3 = "; d3.showdist();
    d3 = 10.0 + (float)d1; // float + Distance: OK
    cout << "\nd3 = "; d3.showdist();
0
06.03.2016, 17:03

Не по теме:

nd2, ааа, вот оно что, даже не увидел...

0
28 / 20 / 11
Регистрация: 10.02.2016
Сообщений: 237
06.03.2016, 19:25  [ТС]
Вообщем если float() раскомментить, то выдаёт ошибку. Вроде понял в чём дело. У компилятора есть два варианта как посчитать сумму:

C++
1
d3 = d1 + 10.0;
Это либо преобразовать d1 во float, сложить float и затем преобразовать к Distance или преобразовать float к Distance, сложить Distance и затем копировать. Вообщем доопределил явно эти сложения и заработало:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
class Distance{ // Класс английских расстояний
    private:
        int feet;
        float inches;
    public:
        Distance(){ feet = 0; inches = 0.0; } // конструктор без аргументов
        Distance(float fltfeet){ // конструктор (1 арг.) // Переводит float в Distance
            feet = int(fltfeet); // feet - целая часть
            inches = 12*(fltfeet - feet);// слева - дюймы
        }
    Distance(int ft, float in){ feet = ft; inches = in; } // конструктор (2 арг.)
    void showdist(){ cout << feet << "\'-" << inches << '"'; } // Вывести длину
    friend Distance operator + (Distance, Distance); // дружественный
    friend Distance operator + (Distance, float);
    friend Distance operator + (float, Distance);
    operator float(){return float(feet+inches/12);}
};
 
Distance operator + (float d2,Distance d1){
    int f=d1.feet+int(d2);
    float i=d1.inches+(d2-int(d2))*12;
    if(i >= 12.0){ i -= 12.0; f++; }
    return Distance(f, i);
}
 
Distance operator + (Distance d1,float d2){
    int f=d1.feet+int(d2);
    float i=d1.inches+(d2-int(d2))*12;
    if(i >= 12.0){ i -= 12.0; f++; }
    return Distance(f, i);
}
 
Distance operator + (Distance d1, Distance d2){ // d1 + d2
    int f = d1.feet + d2.feet; // + футы
    float i = d1.inches + d2.inches; // + дюймы
    if(i >= 12.0){ i -= 12.0; f++; } // если больше 12 дюймов, уменьшить на 12 дюймов, прибавить 1 фут
    return Distance(f, i); // Новая длина с суммой
}
///////////////////////////////////////////////////////////
int main()
{
Distance d1 = 2.5; // конструктор переводит
Distance d2 = 1.25; // float-feet в Distance
Distance d3;
cout << "\nd1 = "; d1.showdist();
cout << "\nd2 = "; d2.showdist();
d3 = d1 + 10.0; // distance + float: OK
cout << "\nd3 = "; d3.showdist();
d3 = 10.0 + d1; // float + Distance: OK
cout << "\nd3 = "; d3.showdist();
cout << endl;
return 0;
}
0
BrainOverflow
 Аватар для sab1ch
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
06.03.2016, 19:36
Цитата Сообщение от nd2 Посмотреть сообщение
С этим?
Joey Black, зачем столько перегрузок?
Попробуйте раскоментить и так сделать, без лишних перегрузок:
C++
1
2
3
4
d3 = float(d1) + 10.0; // distance + float: OK
cout << "\nd3 = "; d3.showdist();
d3 = 10.0 + float(d1); // float + Distance: OK
cout << "\nd3 = "; d3.showdist();
1
28 / 20 / 11
Регистрация: 10.02.2016
Сообщений: 237
06.03.2016, 19:39  [ТС]
Так у компиляторы только один вариант остаётся и нет неопределённости, но если мы хотим иметь обычную запись, то ведь перегрузки необходимы?
0
BrainOverflow
 Аватар для sab1ch
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
06.03.2016, 19:44
Joey Black, если, например, локальные переменные х и y сложить, то нет. А если объекты класса с объектом класса/числом, то да. Если вы про это, конечно.
0
28 / 20 / 11
Регистрация: 10.02.2016
Сообщений: 237
06.03.2016, 19:47  [ТС]
да, про это
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,238
06.03.2016, 19:51
Простите, ТС, вы в конце концов определились, на перегрузку какого оператора у вас упражнение? В заголовке 'operator float', в тексте 'operator *', в коде 'operator +'. Так на что упражнение-то?
0
BrainOverflow
 Аватар для sab1ch
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
06.03.2016, 19:53
TheCalligrapher, на + там перегрузка в книге.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.03.2016, 19:53
Помогаю со студенческими работами здесь

Перегрузка оператора []
При перегрузке оператора возникли проблемы, подскажыте как правильно перегрузить этот оператор, чтоб можно было устанавливать и получать...

Перегрузка оператора +
Делаю класс полиномов, которые можно складывать и перемножать. Каждый член полинома есть отдельный класс под названием Term. в классе Term...

Перегрузка оператора
Имеется время, например 12:12:12 Перегрузка инкремента Time &amp;Time::operator ++ () { Next(); return *this; } ...

Перегрузка оператора ++
Написал префиксную перегрузку ++ Vremya &amp;Vremya::operator ++ () { int sec = getSec(*this); //перевод в секунды ...

Перегрузка оператора
Здравствуйте.Появился вопрос: есть две переменные float **m,**m1 как перегрузить оператор = в данном случае?(имею ввиду только первую...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru