2015-12-04 65 views
0

我有有指点一下那些电影的一个项目中,有一个与电影叫做“电影”列表的主类,和工人阶级的列表的指针。问题是,每次我删除电影从我的列表它不会自动在我的工人名单中删除,我有这一个了几个小时无解..代码非常简单..去除指针C++

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

电影被添加到预期的名单,问题是,一旦我删除那些电影之一,我不知道如何实际它从工人删除指针指向不会造成麻烦。这里是我从主类的代码,就如何从列表中删除一部电影(预计,所有指向它的指针都将从列表中删除)。 重要 - 电影得到从主列表中删除“电影”,并且预计到“moviesOfWorker”,但不得到从Worker类删除(短片* 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 .. ??

+3

如果您切换到使用[智能指针(https://en.wikipedia.org/wiki/Smart_pointer),你就不需要担心内存管理。 – NathanOliver

+0

不能在我的代码中使用它们.. – aviadm71

+0

你有什么问题?您的工作人员列表不拥有这些指针,因此您只需从主列表中删除该影片后删除列表条目。你究竟在挣扎什么? – SergeyA

回答

0

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

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

一旦你有地址,你需要通过你的工作人员名单*并将其从每个工作人员中删除。

你已经做了之后,然后从你的电影列表中删除。

+0

我做过之前,现在编辑它.. 现在,每次我删除一部电影它确实会被删除,但是一旦我尝试向该工作人员添加一部新电影 - 所有其他电影在它删除之前。 – aviadm71

+0

为什么要在toBeRemoved上调用delete?这会从内存中删除Worker(假设它是动态分配的)。 –

+0

另外,为什么在删除后休息?你想从所有的工作人员中删除该电影。 –