【发布时间】:2021-08-26 12:59:44
【问题描述】:
这里是代码 在 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 与同一部电影有联系,它们应该共享同一个“电影”对象。 就我而言,它们有不同的电影对象。 正确的方法是在 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
我知道如何解决上述问题,但我无法在使用指针时对上述代码进行更改。有人可以帮我看看当我使用指针时会有什么变化吗?
【问题讨论】:
-
std::vector<Movie>将创建Movie对象副本的向量。向量中的每个元素都是其他Movie对象的副本。并且不同的Movie对象将是真正不同的,因此对一个对象的修改不会传播到其他副本。解决这个问题的简单方法是使用指针。就像你似乎在做的那样?所以请edit你的问题详细说明你遇到的问题。 -
听起来您已经有了解决此问题的计划。您在实施
Role理念时是否面临任何具体问题? -
@NathanPierson 是的,我得到了如何解决该问题的说明,但我无法实施。如果我使用指针,你能帮我看看会有什么变化吗?
-
@Someprogrammerdude 我知道如何解决这个问题,但我在如何实现它时遇到了问题。如果我改用指针,你能告诉我我必须做的改变吗?
标签: c++ object oop many-to-many