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 数组和指针的主要内容,如果未能解决你的问题,请参考以下文章