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

Проблема со взаимодействием класса

08.04.2019, 06:12. Показов 636. Ответов 3

Author24 — интернет-сервис помощи студентам
Работаю в Си\С++ относительно давно, но не особо часто приходилось работать с классами, поэтому многое не понимаю. Суть в том что у меня есть класс, он создан для того чтобы хранить значение и связи между ними. Я реализовал криво косо все операторы перегрузки которые хотел и думал что все будет ок, да я в жизни так не ошибался, я к оператору перегрузки + не могу обратиться, мне нужно передать туда строку, а не выходит, пишет "E2140 выражение должно относиться к целочисленному типу или типу перечисления без области видимости", если для примера взять int, то все работает. Помогите советом, перерыл кучу источников и ничего не помогает, мне нужно реализовать: food+"Значение", food-"Значение", food=food1, food[i], <<food, и пример дружественной функции, потому что и с ней у меня проблемы.

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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
#include "pch.h"
#include <iostream>
#include <fstream>
#include <string.h>
#include <vector>
#include <limits>
#include <list>
 
using namespace std;
 
class Dictionary_of_associations
{
public:
 
    vector<string> Titles;//Значения, которые находятся в словаре ассоциаций
    vector<pair<string, string> > Connections;//Связи значений
    friend void Write(Dictionary_of_associations);//Дружественая функция
 
/////////////Перегруженные конструкторы//////////////////
 
        // Конструктор по умолчанию
    Dictionary_of_associations()
    {
        cout<<"\nКласс создан.\n";
    }
 
    // Конструктор c параметрами по умолчанию
    Dictionary_of_associations(string first_sourse)
    {
        Titles.push_back(first_sourse);
        cout<<"\nКласс с веденным первым элементом создан.\n";
 
    }
 
        // Конструктор копии
    Dictionary_of_associations(Dictionary_of_associations &source)
    {
        for (int i = 0; i < source.Titles.size(); i++)
            Titles.push_back(source.Titles[i]);
 
        for (int i = 0; i < source.Connections.size(); i++)
            Connections.push_back(source.Connections[i]);
 
        cout<<"\nВсе данные были перекопированны в новый класс.\n";
        }
     
    /////////////Деконструктор//////////////////
 
    ~Dictionary_of_associations()
    {
        Titles.clear();//Очистка значений словаря ассоциаций
        Connections.clear();//Очистка связей значений словаря
        cout<<"\nВсе данные удалены.\nКласс деконструирован.\n";
    }
 
/////////////Перегруженные операции//////////////////
     
     void operator + (string name)//Добавление элемента
    {
        if(this->Titles.size()>0)
        { 
        cout<<"Выберите с какими значениями будет ассоциироваться "<<name<<": \n\n";
            for(int i=0; i<this->Titles.size(); i++)
            {
                cout<<i+1<<". "<<this->Titles[i]<<endl;
            }
            cout<<"\nДля завершения добавления ассоциаций нажмите '0'\n\nВведите через проблел номера для создания связей:\n";
            int index;
            do{
                cin>>index;
                if(!(index==0||index<0||index>this->Titles.size()))
                {
                    Connections.push_back(make_pair(this->Titles[index-1], name));
                }
                else
                    break;
            }while(true);
            
        }
        else
            cout<<"Словать пуст.\nДобавлние элемента невозможно.\n";
    }
 
    Dictionary_of_associations operator - (string name)//Óäàëåíèå ýëåìåíòà
    {
        if (Titles.size() > 0)
        {
            for (int i = Connections.size() - 1; i >= 0; i--)
            {
                if (Connections[i].first == name || Connections[i].second == name)
                    Connections.erase(Connections.begin() + i);
            }
            cout << "Çíà÷åíèå " << name.c_str() << " è âñå àññîöèàöèè ñ íèì áûëè óäàëåíû. \n\n";
        }
        else
            cout << "Ñëîâàòü ïóñò.\nÄÓäàëåíèå ýëåìåíòà íåâîçìîæíî.\n";
    }
 
    Dictionary_of_associations operator [] (int index)//Èíäåêñèðîâàíèå
    {
        if (index >= 0 && index < Titles.size())
        {
            cout << "Çíà÷åíèå íàõîäÿùååñÿ ïî èíäåêñó: " << Titles[index].c_str()<< endl;
            cout << "\nÑïèñîê ñâÿçåé â ñëîâàðå àññîöèàöèé:\n";
            for (int i = 0; i < Connections.size(); i++)
            {
                if (Connections[i].first == Titles[index] || Connections[i].second == Titles[index])
                    cout << "\t" << Connections[i].first.c_str() << "<=>" << Connections[i].second.c_str() << endl;
            }
            cout << endl;
        }
        else
            cout << "\nÏî äàííîìó èíäåêñó íå ñóùåñòâåò çíà÷åíèå.\n";
    }
 
    Dictionary_of_associations operator = (Dictionary_of_associations Data)//Êîïèðîâàíèå
    {
        for (int i = 0; i < Data.Titles.size(); i++)
            Titles.push_back(Data.Titles[i]);
 
        for (int i = 0; i < Data.Connections.size(); i++)
            Connections.push_back(Data.Connections[i]);
    }
 
    bool operator == (Dictionary_of_associations Data)//Îòíîøåíèå ðàâåíñòâà
    {
        if (Titles.size() != Data.Titles.size() || Connections.size() != Data.Connections.size())
            return false;
 
        for (int i = 0; i < Titles.size(); i++)
            if (Titles[i] != Data.Titles[i])
                return false;
 
        for (int i = 0; i < Connections.size(); i++)
            if (Connections[i].first != Data.Connections[i].first || Connections[i].second != Data.Connections[i].first)
                return false;
 
        return true;
    }
 
    bool operator > (Dictionary_of_associations Data)//Îòíîøåíèå ïîðÿäêà
    {
        if (Titles.size() <= Data.Titles.size())
            return false;
        return true;
    }
 
    ostream & operator << (ostream &stream)//Âûâîò çíà÷åíèÿ êîíòåéíåðà
    {
        for (int i = 0; i < Titles.size(); i++)
        {
            stream << Titles[i].c_str() << ": {";
            for (int j = 0; j < Connections.size(); j++)
            {
                if (Connections[j].first == Titles[i])
                    stream << Connections[j].second.c_str()<< " ";
                else if (Connections[j].second == Titles[i])
                    stream << Connections[j].first.c_str()<< " ";
            }
            stream << ": }\n";
        }
        return stream;
    }
 
};
 
void Write(Dictionary_of_associations object)
{
    char name[20];
    cout << "Ââåäèòå èìÿ ôàéëà: ";
    cin.getline(name, 20);
 
    ofstream out;
    out.open(name);
 
    for (int i = 0; i < object.Titles.size(); i++)
    {
        out << object.Titles[i].c_str()<< ": {";
        for (int j = 0; j < object.Connections.size(); j++)
        {
            if (object.Connections[j].first == object.Titles[i])
                out << object.Connections[j].second.c_str()<< " ";
            else if (object.Connections[j].second == object.Titles[i])
                out << object.Connections[j].first.c_str()<< " ";
        }
        out << ": }\n";
    }
 
    out.close();
    cout << "\nÔàéë óñïåøíî ñîçäàí è çàïîëíåí.\n";
}
 
 
int main()
{
setlocale(LC_ALL, "Rus");
    cout<<"Данная лабораторная работа является демонстрационной для oзнакомления с классами и оператрами пергрузок в с/с++\n";
    
    Dictionary_of_associations food();
    
    int index;
    do
    {
        
        cout<<"\nВыберете действие из предложенного списка:\n\n";
        cout<<"1. Добавить значение в словарь(Оператор +)\n";
        cout<<"2. Удалить значение из словаря(Оператор -)\n";
        cout<<"3. Получить информацию по индексу(Оператор [])\n";
        cout<<"4. Вывести весь словарь(Оператор <<)\n";
        cout<<"5. Записать в файл(Дружественная функция)\n";
        cout<<"   Для выхода нажмите '0'\n\n";
        cout<<"Действие: ";
        cin>>index;
        
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(),'\n');
        
        switch(index)
        {
            case 1:{
                char value[20];
                cout<<"\nВведите значение для добавления в базу: ";
                cin.getline(value, 20);
                food+value;
                break;
             }
             case 2:{
                
                break;
             }
             case 3:{
                
                break;
             }
             case 4:{
                cout<<food;
                break;
             }
             case 5:{
                //Write(food);
                break;
             }
             case 0:{
                break;
            }
             default:
             {
                cout<<"\nВы введи несуществующее значение.\n\n";
             } 
         }
         system("pause");
         system("cls");
    }while(index!=0);
    
 }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2019, 06:12
Ответы с готовыми решениями:

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

Проблемы с взаимодействием программы с БД
Дело вот в чем. Есть программа на C#, которая работает с локальной БД. До сегодняшнего дня...

Помогите с межъязыковым взаимодействием
Задача такая: нужно написать *.dll на С++, импортировать в С# и там уже использовать. У меня ни...

Подскажите с взаимодействием потоков
Создать два потока-писателя и один поток-читатель. Реализовать взаимодействие с помощью каналов....

3
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
08.04.2019, 06:26 2
Цитата Сообщение от Leon_ Посмотреть сообщение
food+"Значение"
C++
1
void operator + (const char* name)
0
0 / 0 / 0
Регистрация: 12.02.2015
Сообщений: 8
08.04.2019, 21:23  [ТС] 3
Я пытался по разному и ваш вариант тоже, но, результат один: E2140 выражение должно относиться к целочисленному типу или типу перечисления без области видимости, может кто-то сталкивался или есть адекватный пример операторов перегрузки и строкового типа?
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
08.04.2019, 21:43 4
Leon_, что у тебя за среда, что без #include <string> компилируется это?
Цитата Сообщение от Leon_ Посмотреть сообщение
C++
1
cout<<"Выберите с какими значениями будет ассоциироваться "<<name<<": \n\n";
Добавлено через 5 минут
Цитата Сообщение от Leon_ Посмотреть сообщение
C++
1
Dictionary_of_associations food(); // объявление функции, а не создание объекта класса
C++
1
Dictionary_of_associations food;
Добавлено через 2 минуты
Цитата Сообщение от Leon_ Посмотреть сообщение
C++
1
ostream & operator << (ostream &stream)
Это дружественной функцией (с двумя параметрами) нужно делать, или придётся так писать:
C++
1
food << cout;
0
08.04.2019, 21:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2019, 21:43
Помогаю со студенческими работами здесь

Взаимодействием DateTimePicker и DBEdit
Есть база на аксес, добавляю дату в базу DBEdit1.Text:=DateToStr(DateTimePicker1.Date) добавляется...

Связь между электромагнитным взаимодействием и правилом октета-дуплета
Добрый день, уважаемые пользователи форума! Я не являюсь специалистом в данной области и...

Где взять простой код с наследованием со взаимодействием с базой данных?
Ребят, подскажите , пожалуйста где взять простой код с наследованием со взаимодействием с базой...

Проблема с экземплярами класса
Только начал изучат данный язык, по этому прошу прощения за глупый вопрос. Собственно проблема с...


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

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

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