Как вместо структуры написать класс

помогите пожалуйста переделать данную структуру в класс. Вот условие для класса: реализовать корректировку записей внутри файла без полной перезаписи файла. Все методы класса должны иметь модификатор 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 шт):

Автор решения: LShadow77

Покажу, как обернуть массив структур в класс на части вашего кода. Весь код сделаете по аналогии. И так, имеем:

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. В этом ответе возможны опечатки))

→ Ссылка