【问题标题】:How to Change the Code After inserting Object in Vectors [duplicate]在向量中插入对象后如何更改代码[重复]
【发布时间】:2021-08-26 21:19:27
【问题描述】:

在 Movie.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 中的代码来帮助我。

【问题讨论】:

  • 您是否使用std::shared_ptr进行过调查?
  • @user4581301 是的,我已经这样做了,但我需要根据上述指令编辑代码,即插入角色对象
  • 这个问题与this one有何不同?
  • "请有人帮助我,使用上面定义的“角色”对象编辑 Movie.hpp 和 Actor.hpp 中的代码" - 听起来像是一项家庭作业。 StackOverflow 是一个问答网站,不是作业服务器,也不是代码编写服务。到目前为止,您尝试过什么来尝试自己实现这一点?
  • 这实际上是你提出这个问题的第三次切入点。在所有三个shared_ptr 中都被建议了。我强烈建议尝试并询问有关shared-ptr 的问题。一遍又一遍地问同一个问题,而没有表现出任何努力来实施以前建议的解决方案,这并不能很好地反映。

标签: c++ oop c++11 pointers


【解决方案1】:

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

每部电影都有唯一的 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);
    }
};

ActorPerson 并具有关联(作用于)零或电影。在这种情况下,我们将有一个 外键Movie ID 的容器。

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; 

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

【讨论】:

  • 如果这是我认为的方向,Role 将不保存指针,而是保存 ID。 ID 将用于查找 Movie,可能在 map 或类似地图的容器中。
  • 是的,这种技术使用 ID 和外键,因为它们可以很容易地转移到真实的数据库中。此外,指针方法使事情变得复杂,尤其是所有权规则和深拷贝。
猜你喜欢
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 2014-08-01
  • 1970-01-01
  • 2012-04-30
  • 2019-03-23
  • 1970-01-01
相关资源
最近更新 更多