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

Ошибка в перегрузке метода operator<

15.03.2017, 16:03. Показов 488. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
main.cpp
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
#include <iostream>
#include "addressBook.h"
 
int main(){
    
//
    AddressBook book;
    
    Address a;
    a.lastname("Smith");
    a.firstname("Joan");
    a.phone("(617) 555-9876");
    a.address("The Very Big Corporation \nSomewhere, MA 01000");
    
    Address b;
    b.lastname("Adams");
    b.firstname("Abigale");
    b.phone("(212) 555-3734");
    b.address("743 Broadway\nNewYork, NY");
    
    Address c;
    c.lastname("Neighborhood Video");
    c.phone("555-FILM");
    
    int a_id = book.insertAddress(a);
    int b_id = book.insertAddress(b);
    int c_id = book.insertAddress(c);
    std::cout<<"*** Three Address Entries ***\n";
    book.print();
    
    /* Запись d имеет то же имя, что и b */
    Address d;
    d.lastname("Adams");
    d.firstname("Abigale");
    d.phone("(508) 555-4466");
    d.address("1 Small St.\nMarlboro, MA 02100");
    
    /* Ввод записи с тем же именем */
    int d_id = book.insertAddress(d);
    std::cout<<"*** After adding a duplicate Abigale Adams ***\n";
    book.print();
    
    /* Удаление адреса */
    book.eraseAddress(a_id);
    std::cout<<"*** After erasing Joan Smith ***\n";
    book.print();
    
    /* Замена адреса */
    c.address("22 Main St.\nMy town, MA 02200");
    book.replaceAddress(c, c_id);
    std::cout<<"*** After replacing Neighborhood Video ***\n";
    book.print();
    
    /* Возвращение и печать адреса */
    const Address& d2 = book.getAddress(d_id);
    std::cout<<"*** Copy of d: ***\n"
             <<d2.firstname()<<" "<<d2.lastname()<<"\n"
             <<d2.address()<<"\n"<<d2.phone()<<"\n"
             <<std::endl;
    
    return 0;
}
Файл address.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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <utility>
using namespace std::rel_ops;
#ifndef Address_dot_h
#define Address_dot_h 1
#include <string>
 
class Address{
    
    public:
        /* Конструктор по умолчанию инициализирует recordId значением 0, а все строки делает пустими*/
        Address():recordId_(0){}
        
        /* Функции доступа к полям */
        int recordId() const {return recordId_;}
        void recordId(int i){recordId_=i;}
        
        std::string lastname() const {return lastname_;}
        void lastname(const std::string&);
        
        std::string firstname() const {return firstname_;}
        void firstname(const std::string&);
        
        std::string phone() const {return phone_;}
        void phone(const std::string&);
        
        std::string address() const {return address_;}
        void address(const std::string&);
        
        bool operator==(const Address&);
        bool operator<(const Address&);
        
    private:
        /* Поля данных */
        int recordId_;
        std::string lastname_;
        std::string firstname_;
        std::string phone_;
        std::string address_;
};
 
#endif // Address_dot_h
address.cpp

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
#include "address.h"
 
void Address::lastname(const std::string& s){
    lastname_ = s;
}
 
void Address::firstname(const std::string& s){
    firstname_ = s;
}
 
void Address::phone(const std::string& s){
    phone_ = s;
}
 
void Address::address(const std::string& s){
    address_ = s;
}
 
bool operator==(const Address& a1, const Address& a2){
    
    return (a1.lastname() == a2.lastname() &&
            a1.firstname() == a2.firstname() &&
            a1.phone() == a2.phone() &&
            a1.address() == a1.address()
            );
}
 
bool operator<(const Address& a1, const Address& a2){
    
    if (a1.lastname() < a2.lastname())
        return true;
    else if (a2.lastname() < a1.lastname())
        return false;
    else
        return (a1.firstname() < a2.firstname());
}
addressBook.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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#ifndef AddressBook_dot_h
#define AddressBook_dot_h
#include "address.h"
#include <list>
 
class AddressBook{
    public:
        AddressBook();  // Конструктор
        ~AddressBook(); // Деструктор
        
        /* Классы исключений */
        class AddressNotFound {};
        class DuplicateId {};
        
        int insertAddress(const Address& addr, int recordId = 0)
        throw (DuplicateId);
        
        void eraseAddress(int recordId)
        throw (AddressNotFound);
        
        void replaceAddress(const Address& addr, int recordId = 0)
        throw (AddressNotFound);
        
        const Address& getAddress(int recordId) const
        throw (AddressNotFound);
        
        /* Тестовая программа для вывода на печать содержимого адресной книги */
        void print() const;
        
    private:
        /* Запрет копирования */
        AddressBook(const AddressBook&);
        AddressBook& operator=(const AddressBook&)const;
        
        static int nextId_;
        
        typedef std::list<Address>addrlist;
        addrlist addresses_;
        
        /* Возвращает индекс записи с указанным ID
                    Возвращает end(), если запись не обнаружена*/
        addrlist::iterator getById(int recordId)
        throw (AddressNotFound);
        addrlist::const_iterator getById(int recordId)const
        throw (AddressNotFound);
};
 
#endif // AddressBook_dot_h
Файл addressBook.cpp
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#ifndef _MSC_VER
//#pragme warning(disable : 4786)
#endif
 
#include <iostream>
#include "addressBook.h"
#include <list>
 
int AddressBook::nextId_ = 1;
 
AddressBook::AddressBook() {}
 
AddressBook::~AddressBook() {}
 
int AddressBook::insertAddress(const Address& addr, int recordId)
throw (DuplicateId){
    
    if (recordId == 0)
        /* Если recordId не задан, генерируется новый ID */
        recordId = nextId_++;
    else if (recordId >= nextId_)
        /* Проверяет, чтобы nextId было больше индентификационных номеров всех остальных записей */
        nextId_ = recordId + 1;
    else{
        /* Убеждаемся в отсутствии записей с таким же ID */
        for (addrlist::iterator i = addresses_.begin(); i != addresses_.end(); ++i)
            if (i->recordId() == recordId)
            /* Явно заданный ID не уникален */
            throw DuplicateId();
    }
    
    addrlist::iterator i;
    for (i = addresses_.begin(); i != addresses_.end(); ++i)
        if (addr < *i)
            break;      // ???
        
    /* Вставляет новую запись в список */
    i = addresses_.insert(i , addr);
    
    /* Присваивает записи идентификационный номер */
    addresses_.back().recordId(recordId);
    
    return recordId;
}
 
AddressBook::addrlist::iterator
AddressBook::getById(int recordId) throw (AddressNotFound){
    
    for (addrlist::iterator i = addresses_.begin(); i != addresses_.end(); ++i)
        if (i->recordId() == recordId)
            return i;
    
    throw AddressNotFound();
}
 
AddressBook::addrlist::const_iterator
AddressBook::getById(int recordId) const throw (AddressNotFound){
    
    for (addrlist::const_iterator i = addresses_.begin(); i != addresses_.end(); ++i)
        if (i->recordId() == recordId)
            return i;
    
    throw AddressNotFound();
}
 
void AddressBook::eraseAddress(int recordId)
throw(AddressNotFound){
    addrlist::iterator i = getById(recordId);
    addresses_.erase(i);
}
 
void AddressBook::replaceAddress(const Address& addr, int recordId)
throw (AddressNotFound){
    
    if (recordId == 0)
        recordId = addr.recordId();
    
    eraseAddress(recordId);
    insertAddress(addr, recordId);
}
 
const Address&AddressBook::getAddress(int recordId) const
throw (AddressNotFound){    
    return *getById(recordId);
}
 
void AddressBook::print() const{
 
    
    for (addrlist::const_iterator i = addresses_.begin(); i != addresses_.end(); ++i){
    
        const Address& a = *i;
        std::cout<<"RecordId: "<<a.recordId()<<"\n"
                 <<a.firstname()<<" "<<a.lastname()<<"\n"
                 <<a.address()<<"\n"<<a.phone()<<"\n"
                 <<std::endl;
    }
 
}
Ошибка в строчке:
C++
1
if (addr < *i)
в файле addressBook.cpp

[Error] passing 'const Address' as 'this' argument of 'bool Address::operator<(const Address&)' discards qualifiers [-fpermissive]

Помогите, пожалуйста!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.03.2017, 16:03
Ответы с готовыми решениями:

Ошибка в перегрузке operator=
Доброго времени суток! Компилятор ругается на перегрузку оператора присвоения. Задумывалось так, что in возвращает ссылку на объект T, т.е....

Ошибка при перегрузке "operator ==" в классе
Если объявляю operator== в классе, то ошибка слишком много параметров для функции оператора #include &lt;iostream&gt; class...

Ошибка в перегрузке метода. Наиболее подходящий перегруженный метод имеет несколько недопустимых аргументов
У класса есть два метода, чтобы не дублировать код один метод вызывает для своих нужд другой метод. Компилятор выдает ошибку: ...

13
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
15.03.2017, 18:58
Почему операции в Address описаны как члены класса, а затем как внешние?
C++
1
bool Address::operator==(const Address& ad2)
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
15.03.2017, 19:04
Цитата Сообщение от _wetman_ Посмотреть сообщение
[Error] passing 'const Address' as 'this' argument of 'bool Address::operator<(const Address&)' discards qualifiers [-fpermissive]
Говорит о том что идет доступ не к константным полям класса Address в методе operator<. Что есть "правда", так как методы:
lastname, firname и т.д не константны. Добавьте к ним модификатор const.
0
0 / 0 / 0
Регистрация: 13.03.2017
Сообщений: 15
15.03.2017, 19:25  [ТС]
Цитата Сообщение от stima Посмотреть сообщение
Добавьте к ним модификатор const.
Так он ругается на то, что я им присваиваю значение.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
15.03.2017, 19:37
Цитата Сообщение от _wetman_ Посмотреть сообщение
Так он ругается на то, что я им присваиваю значение.
Это не верное суждение (перевод).

Кратко, псевдо код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Object
{
     void method();
     void method() const;
};
 
operator< (const Object& o) <- const 
{
       o.method(); // "const this->const method"
}
 
operator< (Object& o) <- not const 
{
       o.method(); // "not const this-> not const method"
}
В Вашем случае:
C++
1
2
3
4
5
6
7
8
9
class Object
{
     void method();
};
 
operator< (const Object& o) <- const 
{
       o.method(); // "const this-> NOT const method" -> discards qualifiers
}
0
0 / 0 / 0
Регистрация: 13.03.2017
Сообщений: 15
15.03.2017, 19:58  [ТС]
stima, то есть я должен описать перегрузку так?
C++
1
2
bool operator==(Address&) const;
bool operator>(Address&) const;
Добавлено через 6 минут
nmcf, у меня же не так описано, как вы описали.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
15.03.2017, 20:40
В классе у тебя правильно, а реализация идёт как friend с двумя параметрами. Вот и сделай нормально. Это помимо всяких const.
0
0 / 0 / 0
Регистрация: 13.03.2017
Сообщений: 15
15.03.2017, 21:00  [ТС]
nmcf, а нормально это как?
Я совсем новичок и плохо ориентируюсь в ООП.
И с const я тоже мудрил, но ничего не вышло, ошибка на ошибке.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
15.03.2017, 21:27
Я же показал:
C++
1
2
3
4
bool Address::operator==(const Address& ad2)
{
//...
}
Внутри сравниваешь текущий и ad2 напрямую, без этих функций.
0
0 / 0 / 0
Регистрация: 13.03.2017
Сообщений: 15
15.03.2017, 21:55  [ТС]
nmcf, так тоже делал. Не работает, сейчас скачиваю Qt, попробую через него прогнать. Работал до этого в DevCPP.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
15.03.2017, 22:13
Цитата Сообщение от _wetman_ Посмотреть сообщение
nmcf, так тоже делал
Показывай.

При работе с полями напрямую не может быть проблем с const.
0
0 / 0 / 0
Регистрация: 13.03.2017
Сообщений: 15
16.03.2017, 01:45  [ТС]
nmcf,
C++
1
2
3
4
5
6
7
bool Address::operator==(const Address& a2){
            return(lastname() == a2.lastname() &&
                   firstname() == a2.firstname() &&
                   phone() == a2.phone() &&
                   address() == a2.address()
                   );
        }
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
16.03.2017, 01:52
эммм. не понял в чем проблемы с оператором ==.
но то, что константность забыли - это точно. const и в объявлении и в определении должны быть.
C++
1
2
3
4
5
6
7
8
bool Address::operator==(const Address& a2) const
{
            return(lastname() == a2.lastname() &&
                   firstname() == a2.firstname() &&
                   phone() == a2.phone() &&
                   address() == a2.address()
                   );
        }
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
16.03.2017, 08:42
DU3, ты внимательно прочитал? Напрямую:
C++
1
2
3
4
bool Address::operator==(const Address& a2) const
{
            return lastname_ == a2.lastname_ &&
            //...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.03.2017, 08:42
Помогаю со студенческими работами здесь

Перегрузка метода operator+
Перегрузить + , так чтобы вы находили скалярное произведение двух объектов.

Исправить ошибку в готовой программе в перегрузке метода "output"
Здравствуйте, помогите исправить: Задача:Даны целые массивы А, B, C. Каждый массив пpеобpазовать по пpавилу: если сpеднее аpифметическое...

Ошибка в перегрузке
Заголовок #ifndef CHALLENGE_H #define CHALLENGE_H #include &lt;ostream&gt; using std::ostream; class Stringos { friend...

Ошибка в перегрузке оператора +=
В строках 42-50 пытаюсь описать перегрузку операции +=, но выдаёт ошибку слишком много операторов для этой функции оператора. Но при этом...

Ошибка в перегрузке оператора
Не пойму в чем дело(( Имеется класс вектор ,вычислил длину,а теперь очу сравнить их величины,но не могу составить данный оператор выдает...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru