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

removing a pointer from list of pointers c++

本文关键字:指针 删除 列表 c++      更新时间:2023-10-16

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

在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--;
}

电影正在按预期添加到列表中,问题是一旦我删除了其中一部电影,我就不知道如何在不造成麻烦的情况下从Worker中删除指向它的指针。这是我在main类中关于如何从列表中删除电影的代码(预计所有指向它的指针都会从列表中被删除)。重要-电影会从主列表"电影"中删除,并按预期添加到"moviesOfWorker"中,但不会从Worker类(Movie*moviesOfWorker列表)中删除。

在我的主要班级,电影工业班:

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++);
             }
         }
   }
}

以下是我添加Worker:的方法

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

}

正如我提到的,添加没有问题,只有删除。。帮助。。??

这是一个同步问题,而不是内存管理问题。如果您首先从电影列表中删除电影,那么您将无法从Workers中删除其地址。其地址将不再可用。因此,你需要从获取电影的地址开始。

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

一旦你有了地址,你需要浏览你的Worker*列表,并将其从每个Worker中删除。

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