Как вместо структуры написать класс
помогите пожалуйста переделать данную структуру в класс. Вот условие для класса: реализовать корректировку записей внутри файла без полной перезаписи файла. Все методы класса должны иметь модификатор public, а остальные поля – private.
Условие задачи: для книг, хранящихся в библиотеке, задаются: регистрационный номер книги, автор, название, год издания, издательство, количество страниц. Вывести список книг с фамилиями авторов в алфавитном порядке, изданных после заданного года.
вот код:
#include <iostream>
using namespace std;
struct Books
{
int ID;
char Auth[40];
char Name[50];
int Year;
char Publ[40];
int Pages;
};
void input_struct(Books* base, size_t k)
{
for (size_t i = 0; i < k; ++i)
{
cout << "Введите данные о книге [" << i + 1 << "] (ID, Auth, Name< Year, Publ, Pages): ";
cin >> base[i].ID;
cin >> base[i].Auth;
cin >> base[i].Name;
cin >> base[i].Year;
cin >> base[i].Publ;
cin >> base[i].Pages;
}
std::cout << std::endl;
}
void print_struct(Books* base, size_t k)
{
std::cout << "Состояние полей структуры Books: \n";
for (size_t i = 0; i < k; ++i)
{
cout << base[i].ID << '\t';
cout << base[i].Auth << '\t';
cout << base[i].Name << '\t';
cout << base[i].Year << '\t';
cout << base[i].Publ << '\t';
cout << base[i].Pages << '\t';
cout << std::endl;
}
cout << std::endl;
}
void year_query(Books* base, size_t k)
{
int y;
cout << "Введите год для выборки -> ";
cin >> y;
cout << std::endl;
bool f = false;
cout << "Name " << '\t' << "Auth " << std::endl;
for (size_t i = 0; i < k; ++i)
if (y < base[i].Year)
{
cout << base[i].Name << '\t' << base[i].Auth << endl;
f = true;
}
if (!f)
cout << "Книг после " << y << " года" << " нет" << endl;
}
int main()
{
int m;
setlocale(0, "");
cout << "введите количество книг: "; cin >> m;
Books* base = new Books[m];
input_struct(base, m);
print_struct(base, m);
year_query(base, m);
delete[] base;
return 0;
}
Ответы (1 шт):
Покажу, как обернуть массив структур в класс на части вашего кода. Весь код сделаете по аналогии. И так, имеем:
struct Books
{
int ID;
char Auth[40];
char Name[50];
int Year;
char Publ[40];
int Pages;
};
void input_struct(Books* base, size_t k)
{
for (size_t i = 0; i < k; ++i)
{
cout << "Введите данные о книге [" << i + 1 << "] (ID, Auth, Name< Year, Publ, Pages): ";
cin >> base[i].ID;
cin >> base[i].Auth;
cin >> base[i].Name;
cin >> base[i].Year;
cin >> base[i].Publ;
cin >> base[i].Pages;
}
std::cout << std::endl;
}
Вместо масива просто объявляем класс, содержащий массив и его размер в качестве полей. Массив будет создаваться в конструкторе, удаляться в деструкторе, а функциями-членами класса станут ваши функции. Получится вот так:
class Books
{
struct Book //приватная структура в классе
{
int ID;
char Auth[40];
char Name[50];
int Year;
char Publ[40];
int Pages;
}
Book* base; //указатель на динамический массив структур Book
size_t k; //размер динамического массива
public: //все последующие члены будут открытыми
//конструктор класса - создаёт массив
Books(size_t k)
{
base = new Book[k];
this->k = k;
}
//деструктор класса - удаляет массив
~Books()
{
delete[] base;
}
//далее следуют приобразованные из ваших функций методы класса (в терминологии С++ - функции-члены)
void input_class(); //вместо void input_struct(Books* base, size_t k), параметры уже не нужны
//...
};
/*Далее - превращаем функции в методы (реализация класса)*/
void Books::input_class() //не забываем Books:: перед именем
{
//параметры base и k - теперь поля класса, так что тело не изменилось
for (size_t i = 0; i < k; ++i)
{
cout << "Введите данные о книге [" << i + 1 << "] (ID, Auth, Name< Year, Publ, Pages): ";
cin >> base[i].ID;
cin >> base[i].Auth;
cin >> base[i].Name;
cin >> base[i].Year;
cin >> base[i].Publ;
cin >> base[i].Pages;
}
std::cout << std::endl;
}
/*
Аналогично делаем для остальных функций...
*/
Теперь что поменять в функции `main()'. Было вот так:
Books* base = new Books[m];
input_struct(base, m);
print_struct(base, m);
year_query(base, m);
delete[] base;
Теперь должно стать вот так:
Books* books = new Books(m);
books->input_class();
books->print_class();
books->year_query();
delete books;
Просто вместо создания и удаления динамического массива, создаём и удаляем класс. А вместо вызова функций, вызываем методы класса.
P.S. В этом ответе возможны опечатки))