C++ MovieList 数组和指针

Posted

技术标签:

【中文标题】C++ MovieList 数组和指针【英文标题】:C++ MovieList array and pointer 【发布时间】:2014-12-05 18:34:36 【问题描述】:

我的作业的另一部分仍然有点卡住。

这是提示的要求:

现在你可以修改 LoadMovies 函数来创建一个 MovieList 对象并将每个 Movie 对象添加到它。功能 LoadMovies 应该返回一个指向 MovieList 对象的指针。这意味着 您需要在堆上动态创建 MovieList 对象。

更改主函数并将返回的 MovieList 指针存储在 多变的。要测试一切是否按预期工作,您可以使用 MovieList 对象的 PrintAll 函数。

到目前为止,这是我的代码:

class MovieList 

public:
    Movie* movies;
    int last_movie_index;
    int movies_size;
    int movie_count = 0;

MovieList(int size) 
    movies_size = size;
    movies = new Movie[movies_size];
    last_movie_index = -1;


~MovieList() 
    delete [] movies;


int Length() 
    return movie_count;


bool IsFull() 
    return movie_count == movies_size;


void Add(Movie const& m)

    if (IsFull())
    
        cout << "Cannot add movie, list is full" << endl;
        return;
    

    ++last_movie_index;
    movies[last_movie_index] = m;


void PrintAll() 
    for (int i = 0; i < movie_count; i++) 
        movies[last_movie_index].PrintMovie();
    


;

void ReadMovieFile(vector<string> &movies);
void LoadMovies();

enum MovieSortOrder

    BY_YEAR = 0,
    BY_NAME = 1,
    BY_VOTES = 2
;

int main()

    LoadMovies();

    // TODO:
    // You need to implement the Movie and MovieList classes and
    // the methods below so that the program will produce
    // the output described in the assignment.
    //
    // Once you have implemented everything, you should be able
    // to simply uncomment the code below and run the program.

    MovieList *movies = LoadMovies();

    //    // test methods for the Movie and MovieList classes
        //PrintAllMoviesMadeInYear(movies, 1984);
        //PrintAllMoviesWithStartLetter(movies, 'B');
        //PrintAllTopNMovies(movies, 5);

        //delete movies;
    return 0;


void LoadMovies()

    vector<string> movies;
    ReadMovieFile(movies);

    string name;
    int year;
    double rating;
    int votes;

    for (int i = 0; i < movies.size(); i++)
    
        istringstream input_string(movies[i]);
        getline(input_string, name, '\t');
        input_string >> year >> rating >> votes;
        Movie movie (name, year, votes, rating);
        movie.PrintMovie();
    

现在我遇到的问题是教授要求我修改提示中的 LoadMovies 并将其转换为指针。我在画空白。同样出于某种原因,如果我尝试编译它会说:

C:\Users\Andy\Documents\C++ Homework\MovieStatisticsProgram\MovieStatsProgram.cpp:163: error: void value not ignored as it ought to be
     MovieList *movies = LoadMovies();
                                    ^

【问题讨论】:

在 C++ 中,“数组”不是动态的(创建后它们不会改变)。它们可以动态分配 你的指令说要创建一个 Movie 对象数组,但你已经创建了一个 int 数组。 嗨,斯科特,你能解释一下你的意思吗?所以我应该做 movies = new Movie[movies_size] 而不是 *int movies 而应该是 *Movies movies? 【参考方案1】:

你的构造函数顺序不对

MovieList(int size) 
    movies = new int[movies_size];  // movies_size hasn't been initialized yet!
    movies_size = size;
    last_movie_index = -1;

应该是

MovieList(int size)
:  movies_sizesize, moviesnew int[size], last_movie_index0

尽管@ScottMcP-MVP 指出您的数组应该是

Movie* movie;

所以你的构造函数是

MovieList(int size)
:  movies_sizesize, moviesnew Movie[size], last_movie_index0

关于开始使用其余功能的一些建议

Length 函数将返回来自last_movie_index 的当前使用的数量。

IsFull 将检查是否last_movie_index == movies_size - 1

Add 需要使用last_movie_index 来确定数组中的哪个元素来存储电影。

PrintAll 必须从 [0] 迭代到 [movie_count] 并打印出每个元素。

你的 Add 函数看起来像

void MovieList::Add(Movie const& m)

    if (IsFull())
    
        std::cout << "Cannot add movie, list is full" << std::endl;
        return;
    

    movies[last_movie_index] = m;   // assigns a copy to your array
    ++last_movie_index;             // Increment the movie index

【讨论】:

感谢您的帮助,我还有几个问题......我有点卡在 Add 上,使用插入数组中下一个可用元素所需的算法,正如 Scott 所说早些时候,由于我的教授要求一组 Movie 对象,它会是 movies = new Movie[movie_size] 吗? @andayn 是的,您将拥有一个 Movie 数组,您将必须定义您的 Movie 类。请参阅我对 Add 函数的编辑。 很抱歉给您带来这么多麻烦,但您能重读我的帖子并帮我解决我的新问题吗?使用指针会害死我。 “重读我的帖子并帮助我解决我的新问题” Stack Overflow 不是这样做的,而是一次只回答一个问题。如果您还有其他具体问题,您可以发表一篇描述该问题的新帖子,并发布描述该问题的相关小代码 sn-p。 sry,我无意发表我的评论。实际上,我有一个很好的例子来比较堆栈和堆中的地址,但是在查看 cpp 参考中的定义后,我自己有点困惑。他们没有具体说“新”在堆上创建对象,这是我试图说明的重点。因此远离答案。

以上是关于C++ MovieList 数组和指针的主要内容,如果未能解决你的问题,请参考以下文章

C++数组,指针,引用以及三者的复合类型

c++二维数组和二级指针

C++ 指针与数组

C++ 指针 vs 数组

基于arm的C++反汇编 数组和指针的寻址

C++ 指针数组