首页 > 解决方案 > 在向量中插入对象后如何更改代码

问题描述

在电影.hpp

#ifndef MOVIE_H
#define  MOVIE_H

class Movie
{
  private:
    std::string title;
  public:
    std::string getTitle() const {return this->title;}   
    void setTitle(std::string newTitle){this->title = newTitle;}
};

#endif

在 Actor.hpp 中

#ifndef ACTOR_H
#define  ACTOR_H

#include "Person.hpp"
#include "Movie.hpp"

class Actor: public Person
{
  private:
    std::vector<Movie> movieList;
  public:
    void addMovie(Movie newMovie){this->movieList.push_back(newMovie);}
    void printMovies()
    {
      for(Movie movie: this->movieList)
      {
        std::cout << movie.getTitle() << '\n';
      }
    }
};

#endif

如果我添加一个单独的类,代码中会有哪些变化

class Role {
private:
   Actor* actor;
   Movie* movie;
};

并将此类对象的集合存储在 Movie 和 Actor 中

std::vector<Role> movieList; //inside Actor

std::vector<Role> actorList; //inside Movie

请有人通过使用上面定义的“角色”对象编辑 Movie.hpp 和 Actor.hpp 中的代码来帮助我。

标签: c++oopc++11pointers

解决方案


我将在这里使用一些数据库理论。

每部电影都有一个唯一的 ID 和标题:

class Movie
{
    unsigned int m_id;
    std::string  m_title;
  public:  
    Movie(unsigned int id, const std::string& title)
    : m_id(id), m_title(title)
    { ; }

    std::string get_title() { return m_title; }

    void set_title(const std::string& title)
    { m_title = title; }

    std::string get_id() {return m_id;}  

    void set_id(unsigned int id)
    { m_id = id;}

    bool order_by_id(const Movie& b)
    {
        return m_id <= b.m_id;
    }

    bool operator==(const Movie& b)
    {
        return (m_id == b.m_id) && (m_title == b.title);
    }
};

AnActor是 aPerson并且有关联(作用于)零或电影。在这种情况下,我们将拥有一个包含外键MovieID 的容器。

class Actor : public Person
{
  public: 
    std::vector<unsigned int> movie_ids;
  //...
};

现在有一个电影数据库:

std::vector<Movie> movie_database;

要查找包含演员的电影,首先从演员那里获取电影 ID:

Actor judy_g;
unsigned int judy_g_first_movie = judy_g.movie_ids[0];

然后使用电影 ID 从数据库中检索电影:

Movie judy_g_movie = movie_databases[judy_g_first_movie];

这种技术很好,因为您不需要对电影数据库进行排序,您可以使用索引表来代替:

std::map<std::string, unsigned int> role_index_table;
// Associate the role "major" with the first movie.
role_index_table["major"] = 0; 

如果它看起来像数据库并且闻起来像数据库,那么您应该使用数据库而不是自己编写数据库。


推荐阅读