Как сделать шаблон класса - PullRequest
0 голосов
/ 13 октября 2019

Я должен сделать два класса для студентов и преподавателей для библиотечной системы. Каждая часть кода одинакова как для студентов, так и для преподавателей, поэтому я подумал сделать шаблон для обоих классов. Но проблема заключается в том, что во время издания книги (участник берет книгу из библиотеки), студент может взять максимум 2 книги, а факультет - 10. Так что я сравниваю с нет. из книги в прошлом. Как мне разработать шаблон, чтобы при выдаче книги объекту «Студент» он сравнивался с 2, а с факультетом - с 10. Это возможно с шаблоном, или я должен создать отдельный класс для студента и факультета.

этот код в разделе ответа. Как вы можете видеть, у Студента и Факультета есть один и тот же кусок кода, кроме той строки сравнения 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];
};


Ответы [ 2 ]

1 голос
/ 13 октября 2019

Вам нужно что-то вроде этого:

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>;
0 голосов
/ 13 октября 2019

Помните, что шаблон в конечном итоге будет переведен в два разных класса, для студентов и преподавателей. В этом случае, если вы знаете, что у вас будут только эти два класса, по моему мнению, вам лучше написать специализацию для каждого из классов, а не использовать шаблон. Если вы действительно хотите использовать шаблон, вам нужно будет где-то проверить тип экземпляра.

Возможно, вы захотите подумать об изменении своего дизайна. Случай, когда два класса имеют практически одинаковый код, указывает на то, что с дизайном что-то не так. Я бы создал дополнительный класс и передал бы ему объект студента факультета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...