插入指针列表 C++
insert into a list of pointers c++
我正在尝试查看 Movie 实例列表,并将其中一个添加到 Worker class 内的 Movie* 列表中。问题是,当我尝试从 WorkerClass 打印这部电影时,意味着要查看 Worker class 的 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
returns、movieToAdd
被销毁,但您仍然有一个指向它曾经所在的内存的指针。以后使用该指针时的行为是未定义的,但是在您的情况下,您的程序已将该内存重新用于其他用途,并且它恰好将 943829758935781957
存储在您的电影长度过去的位置。
要实现此功能,您需要存储指向对象的指针,以便在您以后需要使用它们时仍然存在。看起来你的 Worker
class 有一个 Movie
的列表,所以你可以存储指向其中一个的指针,而不是制作副本。如果没有,您可能需要使用 new
动态分配您的对象,在这种情况下,您需要确保在使用完它们后 delete
它们。
我正在尝试查看 Movie 实例列表,并将其中一个添加到 Worker class 内的 Movie* 列表中。问题是,当我尝试从 WorkerClass 打印这部电影时,意味着要查看 Worker class 的 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
returns、movieToAdd
被销毁,但您仍然有一个指向它曾经所在的内存的指针。以后使用该指针时的行为是未定义的,但是在您的情况下,您的程序已将该内存重新用于其他用途,并且它恰好将 943829758935781957
存储在您的电影长度过去的位置。
要实现此功能,您需要存储指向对象的指针,以便在您以后需要使用它们时仍然存在。看起来你的 Worker
class 有一个 Movie
的列表,所以你可以存储指向其中一个的指针,而不是制作副本。如果没有,您可能需要使用 new
动态分配您的对象,在这种情况下,您需要确保在使用完它们后 delete
它们。