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

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

Восстановить пароль Регистрация
 
 
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
01.09.2012, 16:49     Перегрузка оператора - #1
В своём классе я перегрузил оператор -,но в функции,использующей вычитание возникает ошибка
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;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2012, 16:49     Перегрузка оператора -
Посмотрите здесь:

C++ Перегрузка оператора +=
Перегрузка оператора = C++
Перегрузка оператора * C++
Перегрузка оператора ~ C++
C++ Перегрузка оператора <<
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
01.09.2012, 18:50     Перегрузка оператора - #21
Я об этом писал в своем первом сообщении в этой теме, и автор сказал что уже делал так.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.09.2012, 18:52     Перегрузка оператора - #22
nexen, На одном компиляторе нет ошибки, на другом будет, третий взорвет компьютер.
C++
1
return &ROOM();
Если ROOM() возвращает объект - после конца этой строчки этот объект уничтожится - указатель будет указывать на место в памяти, где БЫЛ объект класса ROOM, а использование этого указателя (разыменование и использование объекта) - UB со всеми вытекающими отсюда последствиями.
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
01.09.2012, 18:54  [ТС]     Перегрузка оператора - #23
Цитата Сообщение от Toshkarik Посмотреть сообщение
В данном случае левый и правый операнд являются const
спасибо,может мне сделать 2 перегрузки оператора для константного и неконстантного
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
01.09.2012, 18:54     Перегрузка оператора - #24
Цитата Сообщение от Toshkarik Посмотреть сообщение
Я об этом писал в своем первом сообщении в этой теме, и автор сказал что уже делал так.
Оу, видимо упустил, тогда извините.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
01.09.2012, 18:56     Перегрузка оператора - #25
alexey31415, в данном случае Вы же не изменяете ни объект слева ни объект справа. А только создаете новый объект и возвращаете его. Здесь не нужна перегрузка, должно хватить функции:
Date Date::operator-( const Date &right ) const;
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.09.2012, 19:05     Перегрузка оператора - #26
alexey31415, Вообще, в разы логичнее (и правильнее) делать оператор op= членом класса, а оператор op свободной функцией, которая использует внутри себя оператор op=.

Что-то вроде.

http://liveworkspace.org/code/0405e6...edbd76b855a944
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2012, 12:04     Перегрузка оператора -
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.09.2012, 12:04     Перегрузка оператора - #27
Цитата Сообщение от alexey31415 Посмотреть сообщение
необязательно
я пробывал возвращать не копию.а объект
Обязательно. С одним только унарные, но минус может быть и таким.
Yandex
Объявления
02.09.2012, 12:04     Перегрузка оператора -
Ответ Создать тему
Опции темы

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