Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Переделать из структуры в класс на С++

Алексей Громов Ученик (95), закрыт 1 год назад
Помогите, пожалуйста, переделать код программы для телефонной книги. У меня код сделан с использованием структур, а нужно чтобы через класс было. Можно убрать сохранение в файл, просто необходимо чтобы была возможность создать, редактировать, просмотреть и удалить. Код программы в текстовом по ссылке на диск
Код программы С++
Лучший ответ
Реципиент Гений (71302) 1 год назад
В C++ структура и класс отличаются только уровнем доступа по умолчанию к их членам: для class он - private, для struct - public. Как и классы, структуры можно наследовать, можно объявлять в них методы. Структуры и классы разделяют общее пространство имён.

Поэтому если вы замените в объявлении структур 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, но на них его область применения и закончилась. Сейчас индустрия, наконец, осознала это и отшвырнула ООП в сторону. В любом крупном современном проекте от ООП остались рожки да ножки в виде классов, методов, ритуальных сеттеров и геттеров, и одного уровня наследования (интерфейс-реализация). Так что изучение ООП и с ремесленной точки зрения не имеет особых перспектив, если только вы не собираетесь в будущем разрабатывать симуляторы.
Остальные ответы
Михаил Просветленный (30463) 1 год назад
Вот пример того, как можно преобразовать программу телефонной книги с использования 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
&#8203;`oaicite:{"index":0,"invalid_reason":"Malformed citation << \"\\n\\n > \";\n cin >>"}`&#8203; 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. Я удалил код чтения и записи файлов, но вы можете добавить их обратно, если вам нужна эта функциональность.
Алексей ГромовУченик (95) 1 год назад
Спасибо за проделанную работу, но вот программа не запускается и ругается на строку
&#8203;`oaicite:{"index":0,"invalid_reason":"Malformed citation << \"\\n\\n > \";\n cin >>"}`&#8203; sel;
Подскажите, пожалуйста, что может быть не так?
Михаил Просветленный (30463) Алексей Громов, Сообщение об ошибке говорит о том, что цитата неправильно оформлена и имеет недопустимую причину. Это выглядит как строка "oaicite:{"index":0,"invalid_reason":"Malformed citation ​1 Malformed citation << \"\\n\\n > \";\n cin >> ​"}" sel; может иметь неправильный формат или содержать лишние символы, что приводит к аварийному завершению работы программы. Я рекомендую проверить синтаксис и формат цитаты и убедиться, что она соответствует ожидаемому формату для программы.
Похожие вопросы