2015-12-04 68 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

另外,爲什麼在刪除後休息?你想從所有的工作人員中刪除該電影。 –