Задача расчета прибыли кинотеатра и сортировки фильмов с использованием классов и векторов C

#c #class #oop #vector #dynamic-arrays

Вопрос:

Дан класс Movie (id, title, ranking, release date, character number, ticket price, comment etc.) , enum type: ACTION, COMEDY, DRAMA, FANTASY etc. и класс Cinema (name, location) . Мне нужно написать функцию calculateProfit ( Movie*, day) , которая рассчитывала бы прибыль кинотеатра на основе определенного дня. Также мне нужно написать метод выбора фильма на основе некоторых параметров и отсортировать фильмы по дате релиза. Я размышлял над этой проблемой уже несколько дней, но, похоже, я просто не могу написать правильный код.

Здесь я перечислил свои основные трудности:

  1. Как правильно обработать это перечисление, оно не может быть передано объекту конструктором, который я использовал для передачи всего остального?
  2. Я не знаю, как связать эти фильмы с конкретным днем. Как я могу создать вектор в классе Cinema, сформированный путем многократного(или, может быть, есть лучший способ сделать это?) добавления объектов класса Movie, чтобы он сделал свое дело?
  3. Как получить список всех объектов класса Movie, которые имеют одинаковые конкретные атрибуты?
  4. У меня есть идея, как написать алгоритм для сортировки массива дат выпуска. Но проблема в том, чтобы поместить эти даты в массив/вектор. Как я могу перебирать атрибуты объектов в C , чтобы вставить их в свой вектор?

Вот краткий шаблон для моих занятий:

 using namespace std;

class Movie{
public:
    int ID;
    string Title;
    int Ranking;
    string ReleaseDate;
    int CharacterNumber;
    int TicketPrice;
    string Comment;
    //SortingByDate
    enum type{
        ACTION, COMEDY, DRAMA, FANTASY
    };
    Movie(int, string, int, string, int, int, string, type);
    Movie();
};
Movie::Movie(int ID, string Title,int Ranking,string ReleaseDate,int CharacterNumber, int TicketPrice,string Comment, type Type){
    this->ID=ID;
    this->Title=Title;
    this->Ranking=Ranking;
    this->ReleaseDate=ReleaseDate;
    this->CharacterNumber=CharacterNumber;
    this->TicketPrice=TicketPrice;
    this->Comment=Comment;
    //this->type=Type;  //How to pass enums like this using a constructor?
}
class Cinema{
private:
    int calculateProfit();
public:
    //Vector with objects of Movie class
    string name;
    string location;

};
 

Комментарии:

1. Вы задаете сразу несколько вопросов, что делает очень маловероятным, что один ответ будет адекватно охватывать все. Q1 очень прост: вы определили перечисление Movie::type , фактически не создавая поля. Измените это на enum type { ... } Type; .

2. Для Q2: поскольку фильм не принадлежит кинотеатру (он может появляться в нескольких кинотеатрах одновременно, рассмотрите возможность создания глобальной структуры данных, содержащей Movie объекты, и предоставления каждому Cinema a std::vector<Movie*> (или лучше: std::vector<std::shared_ptr<Movie>> ), чтобы он мог ссылаться на глобальный Movie экземпляр.

3. Для Q3 и Q4: вы не можете перебирать атрибуты в C . Вам нужно будет написать функцию селектора, которая проверяет данный атрибут и что-то делает с результатом. Я предлагаю вам задать последующий вопрос по этому поводу.

4. @Botje моя главная борьба здесь заключалась в том, как именно создать такую структуру и как сформировать этот вектор объектов фильма

5. std::vector<Movie> movies; и просто позвоните .push_back() или .emplace_back() позвоните по нему, пока вы читаете (откуда-то) спецификации фильма. В качестве альтернативы используйте a std::map<std::string, Movie> , если вам дают фильмы по имени. Я не могу ответить на этот вопрос за вас; я не знаю полного задания, которое вам дали.