Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
alexey31415
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
#1

Перегрузка оператора - - C++

01.09.2012, 16:49. Просмотров 1149. Ответов 26
Метки нет (Все метки)

В своём классе я перегрузил оператор -,но в функции,использующей вычитание возникает ошибка
C++
1
2
3
error C2678: бинарный "-": не найден оператор, принимающий левый операнд типа "const Date" (или приемлемое преобразование отсутствует)
1>          d:\projects\billing\billing\date.h(34): может быть "const Date &Date::operator -(const Date &)"
1>          при попытке сопоставить список аргументов "(const Date, Date)"
вот
реализация
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
57
58
59
60
61
62
63
64
65
66
67
const Date &operator-(const Date &right);
 
 
//необходим для получения значения
//длительности звонка
const Date &Date::operator-(const Date &right)
{
Date New;
 
//если равны дни
//начала и конца звонка
if
(
(this->year == right.year)   &&
(this->month == right.month) &&
(this->day == right.day)
)
{
    New.hour = this->hour - right.hour;
    
    if(this->minute >= right.minute)
        New.minute = this->minute - right.minute;
    else
        {
            New.hour--;
            New.minute = this->minute + (60 - right.minute);
        }
 
    if(this->second >= right.second)
        New.second = this->second - right.second;
    else
        {
            New.minute--;
            New.second = this->second + (60 - right.second);
        }
        
        return New;
}
 
//если разные дни
//также учитывается случай,когда звонок начался
//в последний день одного месяца
//и закончился в первый день другого
    New.hour    = (23 - right.hour)   + this->hour;
    New.minute  = (60 - right.minute) + this->minute;
    New.second  = (60 - right.second) + this->minute;
    
    if(New.second >= 60)
        {
            New.minute++;
            New.second -= 60;
        }
        
    if(New.minute >= 60)
        {
            New.hour++;
            New.minute -= 60;
        }
        
    if(New.hour >= 24)
        {
            New.day++;
            New.hour -= 24;
        }
    
    return New;
}

и строки,в которых возникает ошибка
C++
1
2
Date timewise = call_start - LastCreditAdd;
Date not_free_duration = duration - free_minutes_on_weekend;

http://www.cyberforum.ru/cpp-beginners/thread132594.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2012, 16:49
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перегрузка оператора - (C++):

Перегрузка оператора ^
Здравствуйте! Необходимо перегрузить бинарный оператор ^ для транспонирования...

Перегрузка оператора +
Написал для перегрузки оператора + class BoolMatrix { private: int feet; ...

Перегрузка оператора >
Добрый день! #include <stdio.h> #include <tchar.h> #include <iostream> ...

Перегрузка оператора
Не могу разобратся с перегрузками, помогите пожалуйста ребята Дать определение...

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

26
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
01.09.2012, 17:07 #2
А у тебя есть коструктор копирования?
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
01.09.2012, 17:10 #3
Объявите функцию как const:
C++
1
const Date &Date::operator-(const Date &right) const;
0
alexey31415
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
01.09.2012, 17:40  [ТС] #4
Цитата Сообщение от nexen Посмотреть сообщение
А у тебя есть коструктор копирования?
безусловно

Цитата Сообщение от Toshkarik Посмотреть сообщение
const Date &Date::operator-(const Date &right) const;
пробывал
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
01.09.2012, 17:42 #5
Тогда выкладывайте весь код.
0
Nick Alte
Эксперт С++
1646 / 1018 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
01.09.2012, 17:47 #6
Бинарный оператор, производящий новый результат из двух неизменяемых операндов, очевидно, должен возвращать не ссылку на переменную, которая умирает сразу после окончания работы оператора, а копию, т. е. не const Date&, а Date. И таки да, такой оператор сам должен иметь модификатор const, так как левый операнд он не изменяет.
0
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
01.09.2012, 17:49 #7
Если я правильно помню, то бинарные оператора перегружаются с двумя аргументами. Добавь второй аргумент const Date &second и замени все this->field на second.field.
Nick Alte, не всегда они умирают. Бывает, выживают некоторое время или до входа в другую функцию (недавно сталкивался)
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
01.09.2012, 18:02 #8
nexen, умирают сразу после выхода из функции. Никаких иногда. Просто по этому адресу еще может хранится это же значение.
0
Nick Alte
Эксперт С++
1646 / 1018 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
01.09.2012, 18:06 #9
Цитата Сообщение от nexen Посмотреть сообщение
не всегда они умирают
Ну для тривиальных типов это неудивительно, но я-то имел в виду, что формально, с точки зрения стандарта, на момент возврата в место вызова переменная перестаёт существовать. Нельзя же в самом деле всерьёз писать программу, рассчитывая на такой побочный эффект.
0
alexey31415
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
01.09.2012, 18:08  [ТС] #10
Цитата Сообщение от nexen Посмотреть сообщение
бинарные оператора перегружаются с двумя аргументами
необязательно
я пробывал возвращать не копию.а объект

Добавлено через 42 секунды
Цитата Сообщение от Toshkarik Посмотреть сообщение
Тогда выкладывайте весь код.
я всё выложил,что нужно,в других местах никаких ошибок
0
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
01.09.2012, 18:08 #11
Цитата Сообщение от Toshkarik Посмотреть сообщение
nexen, умирают сразу после выхода из функции. Никаких иногда. Просто по этому адресу еще может хранится это же значение.
У меня в чате поиск комнат написан примерно так :
ROOM* func()
{
for (iterator x=begin; x!=end; ++x)
if ((*x).room == ROOM_THAT_I_NEED)
return *x;
return &ROOM(); // я знал, что так не безопастно, но решил проверить. В итоге ни одной ошибки за 30 часов работы. Используется эта комната ещё хренову тучу времени, которого хватило бы, чтобы перезаписать блок памяти (если верить тебе). Да, возможно мне просто повезло и этот блок памяти не трогался, но таких переменных было много. На каждое соединение по ~3.
}
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
01.09.2012, 18:08 #12
Цитата Сообщение от alexey31415 Посмотреть сообщение
я пробывал возвращать не копию.а объект
Не нужно пробовать. Нужно возвращать именно объект, иначе UB.
0
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
01.09.2012, 18:10 #13
alexey31415,
http://habrahabr.ru/post/132014/
Два параметра
http://www.amse.ru/courses/cpp2/2010_11_22.html
Два параметра

Более того, тебе так и написано " при попытке сопоставить список аргументов "(const Date, Date)""
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
01.09.2012, 18:14 #14
nexen, оператор может быть элемент-функцией класса. В этом случае принимается лишь один параметр - операнд стоящий справа.
0
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
01.09.2012, 18:17 #15
Цитата Сообщение от Toshkarik Посмотреть сообщение
nexen, оператор может быть элемент-функцией класса. В этом случае принимается лишь один параметр - операнд стоящий справа.
Да, но когда принимается const Date и Date (без const) - то нужно ПРЯМО указывать оба аргумента, другое дело при const Date/const Date или Date/Date
0
alexey31415
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
01.09.2012, 18:26  [ТС] #16
Цитата Сообщение от nexen Посмотреть сообщение
Да, но когда принимается const Date и Date (без const) - то нужно ПРЯМО указывать оба аргумента, другое дело при const Date/const Date или Date/Date
два параметра используются при объявлении,если функция глобальная
не подскажите тогда,как укзаать два аргумента?
0
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
01.09.2012, 18:29 #17
alexey31415, читай на три поста выше. Я указал две ссылки. Там всё четко прописано

p.s Как это "глобальная функция", если мы говорим о классе Date?
0
alexey31415
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
01.09.2012, 18:38  [ТС] #18
в этом случае функция будет глобальной.а мне нужно,чтобы она осталась методом класса
может мне нужно использовать другой параметр в функции

Добавлено через 6 минут
как я понимаю всё из-за того,что я перадю один из параметров вызываемой функции по константной ссылке.а потом вычитаю из этой переменной другую,но как это исправить я не знаю
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
01.09.2012, 18:40 #19
nexen,
C++
1
Date Date::operator-( const Date & ) const;
В данном случае левый и правый операнд являются const, что не понятного то?

Добавлено через 2 минуты
Или Вы хотите сказать что компилятор не может привести Date к const Date? Данные неявные преобразования допустимы, так же как и:
C++
1
2
3
4
5
void func( const int a );
 
int a = 10;
 
func( a );
1
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
01.09.2012, 18:49 #20
Toshkarik, Date к const Date да, но не наоборот. Что-то я так и не разглядел в реализации спецификатор const у оператора
0
01.09.2012, 18:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2012, 18:49
Привет! Вот еще темы с решениями:

Перегрузка оператора <<
Есть такой код. class matrix { public: ......; const double*...

Перегрузка оператора ==
Пытаюсь перегрузить оператор == . Делаю так: В классе: class cData // класс...

Перегрузка оператора +
Не могу заставить работать перегруженный оператор + в функции CMoveByVector ...

Перегрузка оператора
Всем доброго времени суток!Помогите пожалуйста! Перегрузил оператор умножения...


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

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

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