这是代码 在 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
我知道如何解决上述问题,但在使用指针时无法对上述代码进行更改。有人可以帮我看看当我使用指针时会有什么变化吗?
答案 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
的向量。
然后在 Actor
和 Movie
对象中,您可以拥有彼此 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);