从指针列表中删除指针c ++

时间:2015-12-04 17:16:24

标签: c++ list pointers

我有一个项目,其中有一个主要的类,其中包含一个名为" movies"和Worker Class的电影列表,其中包含指向其中某些电影的指针。问题是,每次我从列表中删除一部电影时,它都不会在我的工作人员列表中自动删除,而且几个小时内我没有这个解决方案..代码非常简单..

在Worker类中,希望添加一部电影:

class Worker{
std::list<Movie*> moviesOfWorker;

//from Worker.cpp:     
void Worker::addMovieToWorker(Movie* toAdd){
moviesOfWorker.push_back(toAdd);  //a list of Movie*
numOfMovies++;
}

void Worker::removeMovieFromWorker(Movie* toRemove){
moviesOfWorker.remove(toRemove);
numOfMovies--;
}

正如预期的那样将电影添加到列表中,问题是一旦我删除其中一部电影,我就不知道如何实际删除指向工作者的指针而不会造成麻烦。这是我的主类中的代码,如何从列表中删除一个电影(并且预期,所有指向它的指针都将从列表中删除)。 重要的是 - 电影会从主列表&#34;电影&#34;中删除,并按预期添加到电影工作室&#34;,但不要从工作班级(电影* moviesOfWorker列表)中删除。

在我的主要课程中,MovieIndustry类:

class MovieIndustry {

list<Movie> movies;   //list of all movies
list<Worker*> workers;

void MovieIndustry::removeMovie(string code) {

list<Movie>::iterator it;
if(getNumOfMovies() > 0)
    {
    for (it=movies.begin(); it!= movies.end(); ++it)
         {
             if( code == (it)->getCode() )
             {
              for (std::list<Worker*>::iterator ito=workers.begin(); ito != 
              workers.end(); ++ito)//look for Worker
                        {

                            toBeRemoved = *ito;
                            toBeRemoved -> removeMovieFromWorker(&(*it));

                            delete toBeRemoved;
                            break;
                        }
                it=movies.erase(it++);
             }
         }
   }
}

这是我添加工人的方式:

void MovieIndustry::addWorkerToMovie(string code, int id) {

Worker* toBeAdded=NULL;
Movie movieToAdd;
if (workers.size()>0 )
{
    for (std::list<Worker*>::iterator it=workers.begin(); it != 
    workers.end(); ++it)    //look for Worker
    {
        if ((*it) ->getId() == id)    //the right Worker
        {
            toBeAdded = *it;
            if(movies.size() > 0)
            {
            for (std::list<Movie>::iterator it2=movies.begin(); it2 !=  
            movies.end(); ++it2) //look for movie
            {
                if( it2->getCode() == code)
                {
                    it2->addWorker(toBeAdded);
                    (*it)->addMovieToWorker(&(*it2));
                }
            }//end if
            }
        }
    }
}//endif

}

正如我所提到的,添加没有问题,只有删除.. HELP ..?

1 个答案:

答案 0 :(得分:0)

这是同步问题,而不是内存管理问题。如果您从电影列表中删除电影开始,那么您将无法从工作人员中删除其地址。它的地址将不再可用。所以你需要从获得电影的地址开始。

Movie *address = nullptr;
for (movie: movies) {
  if (movie.getCode() == code) address = &movie;
}

获得地址后,您需要查看Worker *列表并将其从每个工作人员中删除。

完成后,将其从影片列表中删除。