用C++创建一个简单的图书库系统

Creating a simple book library system in C++

本文关键字:简单 系统 一个 创建 C++      更新时间:2023-10-16

我试图用C++(oop风格)创建一个简单的图书库系统,但从第一个class开始,我就遇到了一些设计程序。

这是我的图书类小文件(假设只是草稿)。

#ifndef BOOKS_H
#define BOOKS_H
#include <string>
class Books
{
public:
    Books();
    ~Books() {};
    void createBook();
    //void getBook();

private:
    std::string mBookName;
    std::string mBookAuthor;
    int mId;
};
#endif 

我想创建书籍并将它们添加到文件中。

我的问题如下:

我应该使用Author和Title的数据成员,还是只使用下面这样的函数更新文件?

void Books::createBook()
{
    std::string bookAuthor;
    std::string bookName;
    std::cout << "Enter the book Authorn";
    std::getline (std::cin, bookAuthor);
    //write to file bookAuthor
    std::cout << "Enter the book namen";
    std::getline (std::cin, bookName);
    //write to file bookName
    mId++;
   //write to file mId;
}

我想,如果我有一个数据成员Author和数据成员Title,那么如果我要将书籍添加到文件中,我会在main函数中编写与书籍一样多的书籍对象,这会使代码复杂化很多。。

相反,我正在考虑做:

int main()
{
   Book newBook;
   //some code to ask to user to enter an option to add a new book
   newBook.createBook();
   //rest of the code
   return 0;
}

所以。。。哪个选项更好?

谢谢!

我会思考一个真正的库是如何工作的。

你可以去图书馆找某位作家的书
你可以去图书馆找一些有特定名字的书。

每本书本身就是一个不同的对象,有一个固定的名字和作者。

因此,我将其建模为单个Library对象,其中包含多个Book对象。

Library界面允许您添加一本书,查找具有给定名称的所有书籍,查找给定作者的所有书籍等。

Book界面可以让你找到一本书的名字和作者。

图书馆将不得不管理一批藏书。我会尝试利用STL来收集我的书籍,因为这应该是您第一次使用C++中的数据结构资源。

std::map允许您存储键/值对。key类似于书的名字或作者——你想用它来查找书籍。

value就是书本身。

在这个特定的例子中,我会选择一个std::multimap,因为这允许多个相同的key。这是因为你可以得到同一作者的不止一本书,也可以得到不止一本同名的书。

我想搜索的每个key都有一个multimap,所以这里我有两个——一个用于键入名称的书,一个用于输入作者的书。

CCD_ 13有一个成员函数CCD_。

它返回两个迭代器,用指定的键描述一系列值。

然后,您可以向Library类添加额外的接口,这允许您将所有书籍保存到一个文件中,或者从一个文件等加载它们。

类似以下内容:

书籍:

class Book
{
public:
    Book(std::string author, std::string name)
        : _author(std::move(author))
        , _name(std::move(name))
    {}
    const std::string& author() const { return _author; }
    const std::string& name() const { return _name; }
private:
    const std::string _author;
    const std::string _name;
};

图书馆:

class Library
{
    using BookMap = std::multimap<std::string, std::shared_ptr<Book>>;
public:
    void loadFromFile(const std::string& filename);
    void saveToFile  (const std::string& filename);
    void addBook(std::string name, std::string author)
    {
        auto book = std::make_shared<Book>(std::move(name), std::move(author));
        _books_by_name.emplace(book->name(), book); 
        _books_by_author.emplace(book->author(), book); 
    }
    std::pair<BookMap::const_iterator, BookMap::const_iterator> findByName(const std::string& name)
    {
        return _books_by_name.equal_range(name);
    }
    std::pair<BookMap::const_iterator, BookMap::const_iterator> findByAuthor(const std::string& author)
    {
        return _books_by_author.equal_range(author);
    }
private:
    BookMap _books_by_name;
    BookMap _books_by_author;
}