插入到指针列表中

insert into a list of pointers c++

本文关键字:列表 指针 插入      更新时间:2023-10-16

我试图查看一个Movie实例列表,并将其中一个添加到Worker类中的Movie*列表中。问题是,当我试图从WorkerClass打印出这部电影时,意味着要查看Worker类的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(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返回,movieToAdd就会被销毁,但你仍然有一个指向它曾经所在内存的指针。以后使用该指针时的行为是未定义的,但在你的情况下,你的程序已经将该内存重新用于其他用途,而它恰好将943829758935781957存储在你电影长度曾经所在的位置。

为了实现这一点,您需要存储指向对象的指针,这些对象在以后需要使用时仍然存在。看起来你的Worker类有一个Movie的列表,所以你可以存储一个指向其中一个的指针,而不是复制。如果没有,您可能需要使用new动态分配对象,在这种情况下,您需要确保在使用完对象后使用delete