在C+中创建一个简单的图书库系统+; 我试图在C++中创建一个简单的图书库系统,但是从第一个类我遇到了一些设计程序。
这是我的LittleBooks class.h文件(假设只是一个草稿) 所以。。。哪种选择更好在C+中创建一个简单的图书库系统+; 我试图在C++中创建一个简单的图书库系统,但是从第一个类我遇到了一些设计程序。,c++,oop,C++,Oop,这是我的LittleBooks class.h文件(假设只是一个草稿) 所以。。。哪种选择更好 谢谢 我会通过思考一个真正的图书馆是如何工作的来解决这个问题 你可以去图书馆找到某位作者的书。 你可以去图书馆找到有特定名字的书 每本书本身都是一个不同的对象,有一个固定的名称和作者 因此,我将其建模为单个Library对象,其中包含多个Book对象 Library界面允许您添加一本书、查找具有给定名称的所有书、查找给定作者的所有书等 Book界面允许您查找一本书的名称和作者 图书馆将不得不管理一批藏
谢谢 我会通过思考一个真正的图书馆是如何工作的来解决这个问题 你可以去图书馆找到某位作者的书。
你可以去图书馆找到有特定名字的书 每本书本身都是一个不同的对象,有一个固定的名称和作者 因此,我将其建模为单个
Library
对象,其中包含多个Book
对象
Library
界面允许您添加一本书、查找具有给定名称的所有书、查找给定作者的所有书等
Book
界面允许您查找一本书的名称和作者
图书馆将不得不管理一批藏书。我会尝试利用STL来收集我的书,因为这应该是你第一次去C++中的数据结构资源。
A允许您存储键/值对。键
类似于书的名称或作者-您希望用来查找书籍的东西
值是书本身
在这个特定的例子中,我会选择一个,因为这允许使用多个相同的键
。这是因为你可以从同一个作者那里得到多本书,你也可以得到多本同名的书
我想搜索一个multimap
perkey
,所以这里我有2个-一个用于键入名称的书籍,一个用于键入作者的书籍
multimap
有一个成员函数,允许我们使用同一个键查找所有值
它返回两个迭代器,用指定的键描述一系列值
然后,您可以向库
类添加额外的接口,该类允许您将所有书籍保存到一个文件中,或从一个文件等加载它们
如下所示:
书:
图书馆:
类库
{
使用BookMap=std::multimap;
公众:
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(std::move(name),std::move(author));
_图书按图书名称放置(图书->名称(),图书);
_图书由作者提供。放置(图书->作者(),图书);
}
std::pair findByName(const std::string&name)
{
按名称返回。相等范围(名称);
}
std::pair findbyauther(const std::string&author)
{
按作者返回图书。相等范围(作者);
}
私人:
图书地图(BookMap)(books)(按书名);;
图书地图(BookMap)(books)作者(books);;
}
我会通过思考一个真正的库是如何工作的来解决这个问题
你可以去图书馆找到某位作者的书。
你可以去图书馆找到有特定名字的书
每本书本身都是一个不同的对象,有一个固定的名称和作者
因此,我将其建模为单个Library
对象,其中包含多个Book
对象
Library
界面允许您添加一本书、查找具有给定名称的所有书、查找给定作者的所有书等
Book
界面允许您查找一本书的名称和作者
图书馆将不得不管理一批藏书。我会尝试利用STL来收集我的书,因为这应该是你第一次去C++中的数据结构资源。
A允许您存储键/值对。键
类似于书的名称或作者-您希望用来查找书籍的东西
值是书本身
在这个特定的例子中,我会选择一个,因为这允许使用多个相同的键
。这是因为你可以从同一个作者那里得到多本书,你也可以得到多本同名的书
我想搜索一个multimap
perkey
,所以这里我有2个-一个用于键入名称的书籍,一个用于键入作者的书籍
multimap
有一个成员函数,允许我们使用同一个键查找所有值
它返回两个迭代器,用指定的键描述一系列值
然后,您可以向库
类添加额外的接口,该类允许您将所有书籍保存到一个文件中,或从一个文件等加载它们
如下所示:
书:
图书馆:
类库
{
使用BookMap=std::multimap;
公众:
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(std::move(name),std::move(author));
_图书按图书名称放置(图书->名称(),图书);
_图书由作者提供。放置(图书->作者(),图书);
}
std::pair findByName(const std::string&name)
{
按名称返回。相等范围(名称);
}
std::pair findbyauther(const std::string&author)
{
按作者返回图书。相等范围(作者);
}
私人:
图书地图(BookMap)(books)(按书名);;
图书地图(BookMap)(books)作者(books);;
}
您的图书
对象只能容纳一本书。因此,我应该使用另一个类或其他东西来存储图书对象?“我应该使用数据成员作为作者和标题,还是只使用下面的函数更新文件?”不,这太可怕了。它将您的书籍
类与控制台中的输入紧密耦合。提供getter/setter函数来封装私有数据,并从外部使用这些函数
#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
void Books::createBook()
{
std::string bookAuthor;
std::string bookName;
std::cout << "Enter the book Author\n";
std::getline (std::cin, bookAuthor);
//write to file bookAuthor
std::cout << "Enter the book name\n";
std::getline (std::cin, bookName);
//write to file bookName
mId++;
//write to file mId;
}
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;
}
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;
}