如何制作班级模板

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】:

请记住,模板最终会被翻译成两个不同的班级,学生和教师。在这种情况下,如果您知道您将只有这两个类,我认为,您最好为每个类编写专门化,而不是使用模板。 如果您确实想使用模板,则需要在某处检查实例的类型。

也许您想考虑更改您的设计。两个类的代码几乎相同的情况表明设计有问题。我会创建额外的课程并将学生的对象传递给它。

【讨论】:

以上是关于如何制作班级模板的主要内容,如果未能解决你的问题,请参考以下文章

如何用excel制作中国地图热力数据图

如何制作包含相同控件的 TabItem 模板

如何制作excel模板并保存使用?

如何制作新的 Eclipse 项目模板?

制作一个表格,显示班级的学生信息

如何制作创建超过 1 个文件的 Netbeans 模板?