如何制作班级模板
Posted
技术标签:
【中文标题】如何制作班级模板【英文标题】:How to make class template 【发布时间】:2019-10-13 17:52:00 【问题描述】:我必须为图书馆系统的学生和教师制作两个课程。学生和教师课程的每一部分代码都是相同的,所以我想为这两个课程制作模板。但问题是在图书发行过程中(会员从图书馆取书),学生最多可以取 2 本书,而教师最多可以取 10 本书。所以我在和no做比较。过去的书籍问题。我应该如何设计我的模板,在向 Student 对象发行书籍期间它与 2 进行比较,而在与 Faculty 进行比较时,它与 10 进行比较。 这是否可以使用模板或我应该为学生和教师单独上课。
有人在回答部分提到了这段代码。如您所见, Student 和 Faculty 具有相同的代码,除了比较行 2 和 10 。这不是重复吗。我们能否以某种方式制作模板来合并两个类。因此,学生与 2 进行比较,其他与 10 进行比较。
std::string title_;
std::string description_;
;
class IMember
public:
virtual void takeBook(Book book) = 0;
;
class Student : public IMember
public:
virtual void takeBook(Book book) override
if (num_books_ >= 2)
throw std::out_of_range("Student can take only 2 books at the time !!");
books[num_books_++] = std::move(book);
private:
int num_books_ = 0;
Book books[2];
;
class Faculty : public IMember
public:
virtual void takeBook(Book book) override
if (num_books_ >= 10)
throw std::out_of_range("Student can take only 10 books at the time !!");
books[num_books_++] = std::move(book);
private:
int num_books_ = 0;
Book books[10];
;
【问题讨论】:
什么意思?学生可以出书还是什么?还是拿两本书? @DenisKotov 会员想从图书馆拿书几天在家看。 这看起来不是一个很好的模板应用程序。也许你想在这里使用继承, 您可能希望使用继承而不是模板。当代码除了数据类型(例如链表)相同时,我使用模板。有通用代码时,我重构为父类,使用继承或者做一个独立的函数。 @ThomasMatthews 我知道继承可以是一种选择,但除了比较之外,代码完全相同。 1 用它 2 做,而其他用 10 做。所以我认为应该在这里使用模板。 【参考方案1】:你需要这样的东西:
struct Book
std::string title_;
std::string description_;
bool operator ==(const Book & book)
return title_ == book.title_ && description_ == book.description_;
;
template <uint TMaxNumberOfBook>
class Member
public:
void takeBook(Book book)
if (num_books_ >= TMaxNumberOfBook)
throw std::out_of_range("Member exceeded a number of books taken at the time !!");
books[num_books_++] = std::move(book);
void returnBook(Book book)
if (num_books_ == 0)
throw std::out_of_range("Member does not have book to return at the time !!");
for (int i = 0; i < TMaxNumberOfBook; ++i)
if (books[i] == book)
books[i] = ;
--num_books_;
return;
throw std::invalid_argument("Member has not taken book this book !!");
private:
int num_books_ = 0;
Book books[TMaxNumberOfBook];
;
using Student = Member<2>;
using Faculty = Member<10>;
【讨论】:
在您的代码中查看 Student 和 Faculty 有相同的代码期望如果第一行包含 2 而其他行包含 10 。这不是重复吗。我们能否以某种方式将这两个类结合起来,如果它有学生对象,则与 2 进行比较,如果有 Faculty 类,则与 10 进行比较 嘿!可以解释问题功能如何根据您的代码向教员发行书籍,如果 num>2 它不会发行书籍。如果那个成员是教员怎么办。应该可以出书,教员上限是10人 @NikhilSharma 再次检查,我在代码中删除了 2 个硬编码值【参考方案2】:请记住,模板最终会被翻译成两个不同的班级,学生和教师。在这种情况下,如果您知道您将只有这两个类,我认为,您最好为每个类编写专门化,而不是使用模板。 如果您确实想使用模板,则需要在某处检查实例的类型。
也许您想考虑更改您的设计。两个类的代码几乎相同的情况表明设计有问题。我会创建额外的课程并将学生的对象传递给它。
【讨论】:
以上是关于如何制作班级模板的主要内容,如果未能解决你的问题,请参考以下文章