插入指针列表 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 它们。