对象之间的多对多关系

时间:2021-06-09 13:55:02

标签: c++ object oop many-to-many

这是代码 在 Movie.hpp 中

#ifndef MOVIE_H
#define  MOVIE_H

class Movie
{
  private:
    std::string title;
  public:
    std::string getTitle() const {return this->title;}  // const added 
    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

在 Main.cpp 中,我正在做类似的事情

Movie movie1, movie2, movie3; 
  Actor actor1, actor2;

  movie1.setTitle("Transformers");
  movie2.setTitle("Interstellar");
  movie3.setTitle("The Matrix");

  actor1.setName("Brad");
  actor1.setAge(57);
  actor1.addMovie(movie1); //here
  actor1.addMovie(movie2);

  actor2.setName("Justin");
  actor2.setAge(30);
  actor2.addMovie(movie3);

我被告知我不遵循多对多关系。换句话说,如果actor1 和actor2 与同一部电影有连接,他们应该共享同一个'Movie' 对象。 就我而言,它们有不同的电影对象。 正确的方法是在 Actor 内部存储指向 Movie 的指针:

std::vector<Movie*> movieList;

(指针的集合,而不是对象的集合)

和里面的电影:

std::vector<Actor*> actorList;

另一种正确的方法,我更喜欢这个,是添加一个单独的类

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

并将这些对象的集合存储在 Movie 和 Actor 中,这里的值(不是指针)是可以的

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

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

我知道如何解决上述问题,但在使用指针时无法对上述代码进行更改。有人可以帮我看看当我使用指针时会有什么变化吗?

2 个答案:

答案 0 :(得分:0)

您可以使用向量和智能指针。我不知道你用的是哪个版本的c++,但是你可以用std::shared_ptr<Movie>std::shared_ptr<Actor>。每个电影和演员都有自己的共享指针向量。 此类智能指针可从 c++ 11 中获得。因此,如果您使用 c++ 11 之前的 c++ 版本,则可以使用 boost 库,其中包括以下智能指针:boost::shared_ptr<Movie>boost::shared_ptr<Actor>< /p>

答案 1 :(得分:0)

我的建议是有一个电影和演员的主列表,每个列表都存储为 std::shared_ptr 的向量。

然后在 ActorMovie 对象中,您可以拥有彼此 std::shared_ptr 的向量(也)。

首先是主列表:

std::vector<std::shared_ptr<Movie>> master_movies;
std::vector<std::shared_ptr<Actor>> master_actors;

还有课程:

// Forward declaration
class Movie;

class Actor
{
    // ...

public:
    void addMovie(std::shared_ptr<Movie> movie)
    {
        movies.emplace_back(movie);
    }

private:
    // Movies that the actor has been in
    std::vector<std::shared_ptr<Movie>> movies;
};

class Movie
{
    // ...

public:
    void addActor(std::shared_ptr<Actor> actor)
    {
        actors.emplace_back(actor);
    }

private:
    // Actors in this movie
    std::vector<std::shared_ptr<Actor>> actors;
};

始终在主列表中创建演员和电影,并从电影主列表向演员添加电影,从演员主列表向电影添加演员:

auto fear = std::make_shared<Movie>();
fear->setTitle("Fear and loathing in Las Vegas");
master_movies.emplace_back(fear);

auto depp = std::make_shared<Actor>();
depp->setName("Johnny Depp");
master_actors.emplace_back(depp);

depp->addMovie(fear);
fear->addActor(depp);
相关问题