0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 200
1

Перегрузка оператора для структуры в классе

09.03.2020, 14:36. Показов 548. Ответов 2
Метки нет (Все метки)

Ошибка overloaded 'operator==' must be a binary operator (has 3 parameters) строка 108. Как правильно написать перегрузку оператора в моем случае.

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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include "test_runner.h"
#include <algorithm>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <memory>
#include <utility>
#include <vector>
 
using namespace std;
 
class PriorityCollection {
public:
    using Id = size_t;
 
    // Добавить объект с нулевым приоритетом
    // с помощью перемещения и вернуть его идентификатор
    Id Add(string object)
    {
        data[0].push_back({ move(object), 0, it_data.size() });
        it_data.push_back({ prev(data.begin()->second.end()), true });
        return it_data.size() - 1;
    }
 
    // Добавить все элементы диапазона [range_begin, range_end)
    // с помощью перемещения, записав выданные им идентификаторы
    // в диапазон [ids_begin, ...)
    template <typename ObjInputIt, typename IdOutputIt>
    void Add(ObjInputIt range_begin, ObjInputIt range_end,
        IdOutputIt ids_begin)
    {
        while (range_begin != range_end) {
            ids_begin++ = Add(range_begin++);
        }
    }
 
    // Определить, принадлежит ли идентификатор какому-либо
    // хранящемуся в контейнере объекту
    bool IsValid(Id id) const
    {
        if (id < it_data.size())
            return it_data[id].second;
        return false;
    }
 
    // Получить объект по идентификатору
    const string& Get(Id id) const
    {
        return it_data[id].first->unit;
    }
 
    // Увеличить приоритет объекта на 1
    void Promote(Id id)
    {
        auto found = it_data[id].first;
        size_t index = ++found->priority;
        data[index].push_back(move(*found));
        data[index - 1].erase(found);
        it_data[id].first = prev(data[index].end());
    }
 
    // Получить объект с максимальным приоритетом и его приоритет
    pair<const string&, int> GetMax() const
    {
        auto p = MAX_ITEM();
        return { p->unit, p->priority };
    }
 
    // Аналогично GetMax, но удаляет элемент из контейнера
    pair<string, int> PopMax()
    {
        auto p = MAX_ITEM();
        //cout << p->unit << endl;
        pair<string, int> max { move(p->unit), p->priority };
        //cout << p->unit << endl;
        it_data[p->id].second = false;
        prev(data.end())->second.remove(*p);
        return max;
    }
 
private:
    struct Item {
        Item(string s, size_t p, size_t i)
            : unit { s }
            , priority { p }
            , id { i }
        {
        }
        Item(const Item& it)
            : unit { it.unit }
            , priority { it.priority }
            , id { it.id }
        {
        }
        Item(Item&& it)
            : unit { move(it.unit) }
            , priority { it.priority }
            , id { it.id }
        {
        }
        string unit;
        size_t priority;
        const size_t id;
        
    };
    
    bool operator==(const Item& lhs, const Item& rhs) const
    {
        return lhs.id == rhs.id;
    }
private:
    map<size_t, list<Item>> data;
    vector<pair<list<Item>::iterator, bool>> it_data;
    list<Item>::iterator MAX_ITEM()
    {
        int i = 1;
        while (prev(data.end(), i)->second.empty()) {
            ++i;
        }
        auto& it = prev(data.end(), i)->second;
        auto max_it = it.begin();
        for (auto first = it.begin(); first != it.end(); ++first)
            if (first->id > max_it->id)
                max_it = first;
        return max_it;
    }
    list<Item>::const_iterator MAX_ITEM() const
    {
        int i = 1;
        while (prev(data.end(), i)->second.empty()) {
            ++i;
        }
        auto& it = prev(data.end(), i)->second;
        auto max_it = it.begin();
        for (auto first = it.begin(); first != it.end(); ++first)
            if (first->id > max_it->id)
                max_it = first;
        return max_it;
    }
};
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2020, 14:36
Ответы с готовыми решениями:

Перегрузка оператора + для структуры
У нас есть две строки S1, S2 .После выполнения S3 = S1 + S2 : 1)в S3 должны быть символы входящие...

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

Перегрузка оператора == для string для структуры
Есть программа #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;fstream&gt; #include &lt;string&gt;...

Перегрузка оператора [] в классе
У меня есть класс Array(одномерный массив), и стоит задача перегрузка оператора. Реализовать...

2
5527 / 3015 / 1259
Регистрация: 07.02.2019
Сообщений: 7,618
09.03.2020, 14:40 2
Цитата Сообщение от EvilingDark Посмотреть сообщение
Как правильно написать перегрузку оператора в моем случае.
засунь внутрь Item
C++
1
2
3
4
bool operator==(const Item& rhs) const
    {
        return id == rhs.id;
    }
или вынеси из PriorityCollection
1
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 200
09.03.2020, 14:43  [ТС] 3
Цитата Сообщение от zayats80888 Посмотреть сообщение
засунь внутрь Item
Вроде пробовал так, не работало, попробовал еще раз заработало.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2020, 14:43
Помогаю со студенческими работами здесь

Перегрузка оператора '=' в классе
#include &lt;iostream&gt; #include &lt;cstring&gt; using std::cout; using std::endl; class CMessage {...

Перегрузка оператора + в классе матрица
Есть перегрузка оператора = Matrix&amp; operator = (const Matrix &amp;object) { if (array !=...

Перегрузка оператора в шаблонном классе
Здравствуйте! Есть шаблонный класс Array, описывающий массив. Такая проблема: нужно перегрузить...

Перегрузка оператора присваивания в классе
Напишите пожалуйста простой пример перегрузки оператора присваивания в классе и пояснение зачем это...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru