帮我用C++写一份完整详细的图书管理系统,需要设计基类和派生类,需要书籍类、图书类型类、图书类,要有详细的代码注释。
时间: 2024-03-03 22:53:07 浏览: 81
好的,下面是一个完整详细的图书管理系统代码,包括基类 Book 和派生类 Fiction、NonFiction、BookType,以及图书管理系统类 BookManager。代码中有详细的注释,希望能够帮助你更好地理解和修改代码。
```c++
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 基类 Book,存储书籍的基本信息
class Book {
public:
// 构造函数,初始化书籍基本信息
Book(string title, string author, string publisher, int year) :
m_title(title), m_author(author), m_publisher(publisher), m_year(year) {}
// 虚析构函数,确保在删除派生类对象时调用正确的析构函数
virtual ~Book() {}
// 获取书籍基本信息的函数
string getTitle() const { return m_title; }
string getAuthor() const { return m_author; }
string getPublisher() const { return m_publisher; }
int getYear() const { return m_year; }
// 获取书籍类型的纯虚函数,在派生类中需要进行实现
virtual string getType() const = 0;
private:
string m_title; // 书名
string m_author; // 作者
string m_publisher; // 出版社
int m_year; // 出版年份
};
// 派生类 Fiction,用于表示小说类书籍
class Fiction : public Book {
public:
// 构造函数,初始化小说类书籍信息
Fiction(string title, string author, string publisher, int year, string genre) :
Book(title, author, publisher, year), m_genre(genre) {}
// 获取书籍类型的函数,返回小说类
string getType() const override { return "Fiction"; }
// 获取小说类别的函数
string getGenre() const { return m_genre; }
private:
string m_genre; // 小说类别
};
// 派生类 NonFiction,用于表示非小说类书籍
class NonFiction : public Book {
public:
// 构造函数,初始化非小说类书籍信息
NonFiction(string title, string author, string publisher, int year, string subject) :
Book(title, author, publisher, year), m_subject(subject) {}
// 获取书籍类型的函数,返回非小说类
string getType() const override { return "Non-Fiction"; }
// 获取非小说类书籍的学科领域的函数
string getSubject() const { return m_subject; }
private:
string m_subject; // 非小说类书籍的学科领域
};
// 派生类 BookType,用于表示书籍类型
class BookType {
public:
// 构造函数,初始化书籍类型信息
BookType(string name, vector<Book*> books) : m_name(name), m_books(books) {}
// 获取书籍类型名称的函数
string getName() const { return m_name; }
// 获取该类型下的所有书籍的函数
vector<Book*> getBooks() const { return m_books; }
private:
string m_name; // 书籍类型名称
vector<Book*> m_books; // 该类型下的所有书籍
};
// 图书管理系统类 BookManager,用于管理所有的书籍和书籍类型
class BookManager {
public:
// 添加书籍的函数
void addBook(Book* book) {
m_books.push_back(book); // 将书籍添加到书籍数组中
addBookType(book); // 将书籍添加到对应书籍类型的数组中
}
// 删除书籍的函数
void removeBook(Book* book) {
// 遍历书籍数组,找到对应的书籍并删除
for (auto it = m_books.begin(); it != m_books.end(); ++it) {
if (*it == book) {
m_books.erase(it);
break;
}
}
removeBookType(book); // 将书籍从对应书籍类型的数组中删除
}
// 列出所有书籍的函数
void listBooks() const {
// 遍历书籍数组,输出每本书的基本信息
for (auto book : m_books) {
cout << book->getTitle() << " by " << book->getAuthor() << ", published by "
<< book->getPublisher() << " in " << book->getYear() << endl;
}
}
// 列出所有书籍类型的函数
void listBookTypes() const {
// 遍历书籍类型数组,输出每个书籍类型的名称和所包含的书籍数量
for (auto bookType : m_bookTypes) {
cout << bookType.getName() << " (" << bookType.getBooks().size() << " books)" << endl;
}
}
private:
vector<Book*> m_books; // 所有书籍的数组
vector<BookType> m_bookTypes; // 所有书籍类型的数组
// 将书籍添加到对应书籍类型的数组中
void addBookType(Book* book) {
// 查找书籍类型数组,找到对应的书籍类型并将书籍添加到对应的数组中
for (auto& bookType : m_bookTypes) {
if (bookType.getName() == book->getType()) {
bookType.getBooks().push_back(book);
return;
}
}
// 如果没有对应的书籍类型,则创建一个新的书籍类型并将书籍添加到数组中
vector<Book*> books;
books.push_back(book);
BookType bookType(book->getType(), books);
m_bookTypes.push_back(bookType);
}
// 将书籍从对应书籍类型的数组中删除
void removeBookType(Book* book) {
// 遍历书籍类型数组,找到对应的书籍类型并将书籍从对应的数组中删除
for (auto& bookType : m_bookTypes) {
if (bookType.getName() == book->getType()) {
for (auto it = bookType.getBooks().begin(); it != bookType.getBooks().end(); ++it) {
if (*it == book) {
bookType.getBooks().erase(it);
return;
}
}
}
}
}
};
int main() {
// 创建一个图书管理系统对象
BookManager bookManager;
// 创建一些书籍并添加到图书管理系统中
Book* book1 = new Fiction("The Great Gatsby", "F. Scott Fitzgerald", "Charles Scribner's Sons", 1925, "Tragedy");
Book* book2 = new NonFiction("Introduction to Algorithms", "Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein", "MIT Press", 1990, "Computer Science");
Book* book3 = new Fiction("The Catcher in the Rye", "J.D. Salinger", "Little, Brown and Company", 1951, "Coming-of-age Fiction");
bookManager.addBook(book1);
bookManager.addBook(book2);
bookManager.addBook(book3);
// 列出所有书籍
bookManager.listBooks();
// 列出所有书籍类型
bookManager.listBookTypes();
// 删除一些书籍
bookManager.removeBook(book1);
bookManager.removeBook(book3);
// 列出所有书籍
bookManager.listBooks();
// 列出所有书籍类型
bookManager.listBookTypes();
// 释放内存
delete book1;
delete book2;
delete book3;
return 0;
}
```
希望这份代码能够帮助你完成你的图书管理系统。如有任何问题,请随时向我提问。
阅读全文