Помогите, пожалуйста, переделать код программы для телефонной книги. У меня код сделан с использованием структур, а нужно чтобы через класс было. Можно убрать сохранение в файл, просто необходимо чтобы была возможность создать, редактировать, просмотреть и удалить. Код программы в текстовом по ссылке на диск
Код программы С++
C/C++
Переделать из структуры в класс на С++
В C++ структура и класс отличаются только уровнем доступа по умолчанию к их членам: для class он - private, для struct - public. Как и классы, структуры можно наследовать, можно объявлять в них методы. Структуры и классы разделяют общее пространство имён.
Поэтому если вы замените в объявлении структур struct на class и добавите в начале модификатор доступа public:, то всё должно заработать. Например, если было:
Это, конечно, не в стиле ООП, который предписывает защищать данные и пользоваться только методами, обобщать интерфейсы и реализации, где надо, и где не надо, но честно говоря, этот подход настолько же бессмысленный, насколько и беспощадный. Если же вам ставят обязательное условие совершать эти ритуальные пляски, то реализуйте простые методы доступа (сеттеры и геттеры):
Как общий принцип, я бы посоветовал держаться от ООП подальше. Он изначально пришёл из области разработки авиасимуляторов, более-менее хорошо вписался в разработку искусственных иерархий вроде фреймворков UI, но на них его область применения и закончилась. Сейчас индустрия, наконец, осознала это и отшвырнула ООП в сторону. В любом крупном современном проекте от ООП остались рожки да ножки в виде классов, методов, ритуальных сеттеров и геттеров, и одного уровня наследования (интерфейс-реализация). Так что изучение ООП и с ремесленной точки зрения не имеет особых перспектив, если только вы не собираетесь в будущем разрабатывать симуляторы.
Поэтому если вы замените в объявлении структур struct на class и добавите в начале модификатор доступа public:, то всё должно заработать. Например, если было:
struct MyData {
int a;
string b;
}
То делаем так: class MyData {
public:
int a;
string b;
}
Это, конечно, не в стиле ООП, который предписывает защищать данные и пользоваться только методами, обобщать интерфейсы и реализации, где надо, и где не надо, но честно говоря, этот подход настолько же бессмысленный, насколько и беспощадный. Если же вам ставят обязательное условие совершать эти ритуальные пляски, то реализуйте простые методы доступа (сеттеры и геттеры):
class MyData {
private:
int a;
string b;
public:
int getA() { return a; }
void setA(int a) { this->a = a; }
const string &getB() { return b; }
void setB(const string &b) { this->b = b; }
}
И обращайтесь к данным через эти методы.Как общий принцип, я бы посоветовал держаться от ООП подальше. Он изначально пришёл из области разработки авиасимуляторов, более-менее хорошо вписался в разработку искусственных иерархий вроде фреймворков UI, но на них его область применения и закончилась. Сейчас индустрия, наконец, осознала это и отшвырнула ООП в сторону. В любом крупном современном проекте от ООП остались рожки да ножки в виде классов, методов, ритуальных сеттеров и геттеров, и одного уровня наследования (интерфейс-реализация). Так что изучение ООП и с ремесленной точки зрения не имеет особых перспектив, если только вы не собираетесь в будущем разрабатывать симуляторы.
Вот пример того, как можно преобразовать программу телефонной книги с использования struct на класс в C++:
#include <iostream>
#include <vector>
using namespace std;
class PhonebookRecord {
public:
string name;
string phone;
string note;
PhonebookRecord(string n, string p, string no) : name(n), phone(p), note(no) {}
};
vector<PhonebookRecord> records;
void writeRecord(int i) {
cout << i + 1 << ". " << records[i].name
<< "\t" << records[i].phone << " | ";
int sz = 60 - records[i].name.size() - records[i].phone.size();
if (records[i].note.size() > sz)
cout << records[i].note.substr(0, sz) << "...";
else cout << records[i].note;
cout << endl;
}
int findRecord() {
int sel;
cout << "Which record do you want to find?" << endl
<< "1. By index" << endl
<< "2. By name, phone number or note" << endl
​`oaicite:{"index":0,"invalid_reason":"Malformed citation << \"\\n\\n > \";\n cin >>"}`​ sel;
cout << endl;
if (sel == 2) {
string val;
cout << "Enter the value to search for: ";
cin.ignore();
getline(cin, val);
for (int i = 0; i < records.size(); i++)
if (records[i].name.find(val) != records[i].name.npos ||
records[i].note.find(val) != records[i].note.npos ||
records[i].phone == val)
writeRecord(i);
cout << endl;
}
int number = 0;
bool fail = false;
...
}
int main() {
records.push_back(PhonebookRecord("John Smith", "555-555-5555", "Friend"));
records.push_back(PhonebookRecord("Jane Doe", "555-555-5556", "Family"));
findRecord();
return 0;
}
В этом примере я заменил struct bookRecord на класс PhonebookRecord, который имеет те же три переменные-члена (имя, телефон и заметка) и конструктор, который их инициализирует. Также я заменил вектор recs на records. Я удалил код чтения и записи файлов, но вы можете добавить их обратно, если вам нужна эта функциональность.
#include <iostream>
#include <vector>
using namespace std;
class PhonebookRecord {
public:
string name;
string phone;
string note;
PhonebookRecord(string n, string p, string no) : name(n), phone(p), note(no) {}
};
vector<PhonebookRecord> records;
void writeRecord(int i) {
cout << i + 1 << ". " << records[i].name
<< "\t" << records[i].phone << " | ";
int sz = 60 - records[i].name.size() - records[i].phone.size();
if (records[i].note.size() > sz)
cout << records[i].note.substr(0, sz) << "...";
else cout << records[i].note;
cout << endl;
}
int findRecord() {
int sel;
cout << "Which record do you want to find?" << endl
<< "1. By index" << endl
<< "2. By name, phone number or note" << endl
​`oaicite:{"index":0,"invalid_reason":"Malformed citation << \"\\n\\n > \";\n cin >>"}`​ sel;
cout << endl;
if (sel == 2) {
string val;
cout << "Enter the value to search for: ";
cin.ignore();
getline(cin, val);
for (int i = 0; i < records.size(); i++)
if (records[i].name.find(val) != records[i].name.npos ||
records[i].note.find(val) != records[i].note.npos ||
records[i].phone == val)
writeRecord(i);
cout << endl;
}
int number = 0;
bool fail = false;
...
}
int main() {
records.push_back(PhonebookRecord("John Smith", "555-555-5555", "Friend"));
records.push_back(PhonebookRecord("Jane Doe", "555-555-5556", "Family"));
findRecord();
return 0;
}
В этом примере я заменил struct bookRecord на класс PhonebookRecord, который имеет те же три переменные-члена (имя, телефон и заметка) и конструктор, который их инициализирует. Также я заменил вектор recs на records. Я удалил код чтения и записи файлов, но вы можете добавить их обратно, если вам нужна эта функциональность.
Похожие вопросы
- Создать структуры в с++
- [C++] Помогите написать задачу на структуры!
- Программа на c++ не работает. Написать структуру и прочее. Подскажите, пожалуйста, что я делаю не так.
- Вложенные структуры. С++
- Создать структуру для описания членов вашей семьи
- Помогите решить задачу на структуры в Си.
- Как правильно запихнуть в поле структуры саму структуру? C++
- Язык Си. Тема: структуры данных.
- С++ структуры. Помогите ппжпж жпж пж ж
- Такая лаба мне попалась.. Не шарю в структурах, кому не сложно помогите пожалуйста
​`oaicite:{"index":0,"invalid_reason":"Malformed citation << \"\\n\\n > \";\n cin >>"}`​ sel;
Подскажите, пожалуйста, что может быть не так?