C ++ Добавление элементов в массив и изменение функции для указателя

0

Я все еще немного застрял в другой части моего задания.

Вот что подсказка спрашивает:

Теперь вы можете изменить функцию LoadMovies, чтобы создать объект MovieList и добавить к нему каждый из объектов Movie. Функция LoadMovies должна возвращать указатель на объект MovieList. Это означает, что вам нужно создать объект MovieList динамически и в куче.

Измените основную функцию и сохраните возвращаемый указатель MovieList в переменной. Чтобы проверить, работает ли все так, как ожидается, вы можете использовать функцию PrintAll объекта MovieList.

Вот мой код:

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();
                                    ^
Теги:
pointers

2 ответа

0

Вы не создаете объект типа MovieList().

Метод "LoadMovies" выполняет только чтение и сборку локально.

Функция LoadMovies() ничего не возвращает, вы ничего не можете присваивать.

Почему бы вам не воспользоваться теми методами, которые у вас уже есть. Каждый фильм, который читается, должен войти в объект MovieList. Вызовите метод Add().

Объявите объект MovieList внутри LoadMovies() и измените тип возврата для возврата по ссылке/указателю на MovieList, например

MovieList* LoadMovies();

Если не передать объект MovieList по ссылке и заполнить его.

void LoadMovies(MovieList& mList)

Я думаю, вам нужно взглянуть на основы книги и перейти оттуда. Этот тип вопроса может быть серьезно сокращен.

0

Вы должны объявить прототипы функций в определении класса.

class MovieList {

public:
    MovieList();    // constructor
    ~MovieList();   // destructor

    void Add(Movie const& m);
    bool IsFull();
    ... etc

private:   // Your members should be private, in general
    Movie* movies;
    int last_movie_index;
    int movies_size;
    int movie_count = 0;    
}

Затем все ваши функции должны быть членами вашего класса MovieList чтобы они могли обращаться к переменным-членам и иметь MovieList на this. Например, они были бы вне объявления класса.

int MovieList::Length(){
    // work
}

bool MovieList::IsFull(){
    // work
}

То же самое касается LoadMovies, он должен иметь подпись

MovieList* MovieList::LoadMovies();   // Note it returns a MovieList pointer, not void

Затем в main вы можете сделать экземпляр

int main()
{
    MovieList ml = MovieList();    // instantiate a MovieList

    Movie a = Movie();   // instantiate a couple of movies
    Movie b = Movie();
    ml.Add(a);           // call the Add method
    ml.Add(b);

    MovieList* movies = ml.LoadMovies();  // Calls method from this object
}

В качестве примечания, я замечаю, что в main есть комментарий, который говорит //delete movies; , Фактически, поскольку ваш объект MovieList выделил массив, он должен нести ответственность за очистку после себя. Под этим я подразумеваю, что деструктор должен быть чем-то вроде этого, чтобы вы не просачивали память.

MovieList::~MovieList()
{
    delete[] movies;
    movies = nullptr;
}
  • 0
    Когда я делаю прототипы функций, мой компилятор всегда говорит, что функция не может быть перегружена, а функция переоценена.
  • 0
    Если вы определили функции вне class MovieList { ... } , то им нужна область действия, например, MovieList::IsFull() . Если вы определяете их в области видимости класса, они этого не делают, например, class MovieList { bool IsFull(); } Обратите внимание, что в приведенном выше примере я закрыл фигурные скобки для class MovieList прежде чем писать определения для Length и IsFull .
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню