用C++创建一个简单的图书库系统
Creating a simple book library system in C++
我试图用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;
}
- C++,系统无法执行指定的程序
- 在c++中用vector填充一个简单的动态数组
- (C++)分析树以计算返回错误值的简单算术表达式
- 在UNIX系统中使用DIR查找文件的字节大小
- 我的简单if-else语句是如何无法访问的代码
- 使用简单类型列表实现的指数编译时间.为什么
- 错误处理.将系统错误代码映射到泛型
- 如何在BST的这个简单递归实现中消除警告
- 使用链表 C++ 的简单工资单系统
- 我正在写一个非常简单的字母评分系统,if语句是最有效的吗?
- 有没有一种简单的方法可以将系统命令的输出转换为字符串
- 简单Boost文件系统访问冲突
- 用C++创建一个简单的图书库系统
- 简单的模块系统(回调)
- 如何在 64 位 Ubuntu 系统上安装简单的英特尔 C/C++ 编译器
- 制作一个简单的粒子系统
- 什么是系统("CLS")的简单替代方案?
- C++中的简单事件系统
- 简单的glob在unix系统上的c++
- 使用odeint的简单2d系统(使用数组)无法编译