我正在尝试查看 Movie 实例列表,并将其中一个实例添加到 Worker 类中的 Movie* 列表中。问题是,当我尝试从 WorkerClass 打印出这部电影时,意味着遍历 Worker 类的 Movie* 列表,它打印出垃圾。
void MovieIndustry::addWorkerToMovie(string code, int id) {
Worker* toBeAdded;
Movie movieToAdd;
for (std::list<Worker*>::iterator it=workers.begin(); it !=
workers.end(); ++it)//look for Worker
{
toBeAdded = *it;
for (std::list<Movie>::iterator it2=movies.begin(); it2 !=
movies.end(); ++it2) //look for movie
{
if( it2->getCode() == code)
{
movieToAdd = (*it2);
it2->addWorker(*toBeAdded); //Works
(*it)->addMovieToWorker(movieToAdd);
}
}//end for
} //end for
}
尝试从 Worker.cpp 中的列表打印电影,它给了我:
void Worker::printWorkersMovies() const {
std::list<Movie*>::const_iterator movitt;
if(getNumOfMovies() >> 0)
{
for (movitt=moviesOfWorker.begin(); movitt != moviesOfWorker.end();
++movitt)
{
std::cout << "length is" << ( (*movitt)-> getLength() ) <<std::endl;
// IT PRINTS OUT length is: 943829758935781957
// even though I inserted length = 2
}
}
Movie 的复制构造函数,即使我使用了指针:
Movie::Movie(const Movie& toCopy) {
code = toCopy.getCode();
name = toCopy.getName();
length = toCopy.getLength();
year = toCopy.getYear();
rate = toCopy.getRate();
preview = toCopy.getPreview();
}
我给Worker实例添加电影的方法:
void Worker::addMovieToWorker(Movie& toAdd){
moviesOfWorker.push_back(&toAdd);
}
最佳答案
您正在将指向自动存储的指针添加到您的列表中。一旦 addWorkerToMovie
返回,movieToAdd
就会被销毁,但是您仍然有一个指向它曾经所在的内存的指针。以后使用该指针时的行为是未定义的,但在您的情况下,您的程序已将该内存重新用于其他用途,并且它恰好将 943829758935781957
存储在您的电影长度过去的位置。
要实现这一点,您需要存储指向对象的指针,这些对象在您以后需要使用它们时仍然存在。看起来您的 Worker
类有一个 Movie
列表,因此您可以存储指向其中一个的指针,而不是制作拷贝。如果不是,您可能需要使用 new
动态分配您的对象,在这种情况下,您需要确保在使用完它们后删除
它们。
关于c++ - 插入指针列表 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34047135/