【问题标题】: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 做。所以我认为应该在这里使用模板。

标签: c++ class templates


【解决方案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】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2020-05-26
    相关资源
    最近更新 更多