2010-05-17 2 views
12

Для моего последней CS домашнего задания, я должен создать класс под названием фильм, который держит название, режиссер, год, рейтинг, актер и т.д.C++ Вектор указателей

Тогда я обязан прочитать файл, который содержит список этой информации и сохранить ее в векторе указателей на фильмы.

Я не уверен, что означает последняя строка. Означает ли это, что я читаю файл, создаю несколько объектов Movie. Затем создайте вектор указателей, где каждый элемент (указатель) указывает на один из этих объектов Movie?

Я просто создаю два вектора - один из указателей и один из фильмов и сделайте взаимно однозначное отображение двух векторов?

ответ

29

Это означает что-то вроде этого:

std::vector<Movie *> movies; 

Затем добавить к вектору, как вы читаете строки:

movies.push_back(new Movie(...)); 

Не забудьте удалить все Movie* объектов, как только вы закончите с вектором ,

+0

+! Да, это то, что я тоже взял из вопроса –

+0

Если я создаю вектор ints, я должен оттолкнуть int. Если это вектор bool, я отбрасываю bool. В вашем заявлении я могу отбросить объект фильма или указатель фильма? – xbonez

+0

Вы возвращаете указатель на объект (недавно созданный) фильма. – schnaader

1

Я не уверен, что означает последняя строка. Означает ли это, что я читаю файл, создаю несколько объектов Movie. Затем создайте вектор указателей, где каждый элемент (указатель) указывает на один из этих объектов Movie?

Я бы предположил, что это то, что предназначено. Предполагается, что вы читаете данные для одного фильма, выделяете объект с new, заполняете объект данными и затем нажимаете адрес данных на vector (вероятно, не лучший дизайн, но, скорее всего, то, что предназначено так или иначе).

+0

Нет, я думаю, что то, что нажимается на вектор, на самом деле является указателем. т.е. 'movies.push (новый фильм()); movies.back() -> getData(); 'или что-то. – Cam

+0

@incrediman: Ой, совершенно верно. Мои пальцы пропустили пару слов, когда я печатал ... –

9

Насколько я понимаю, вы создаете класс Movie:

class Movie 
{ 
private: 
    std::string _title; 
    std::string _director; 
    int   _year; 
    int   _rating; 
    std::vector<std::string> actors; 
}; 

и имеющие такой класс, вы создаете экземпляр вектора:

std::vector<Movie*> movies; 

так, вы можете добавить любой фильм на ваш фильмы. Так как вы создаете вектор указателей на фильмы, не забудьте освободить ресурсы, выделенные экземплярами фильмов или вы могли бы использовать некоторые смарт-указатель, чтобы автоматически освободить фильмы:

std::vector<shared_ptr<Movie>> movies; 
+1

Или даже лучше использовать 'std :: vector >', если вектор является единственным объектом, который поддерживает время жизни объектов «Movie» –

+1

Это должно быть принятым ответом – pistacchio

1

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

std::vector<Movie *> movies

Но следует помнить, что вектор не будет удалять свои объекты после этого, что приведет к утечке памяти. Это, вероятно, не имеет значения для вашей домашней работы, но обычно вы должны удалять все указатели, когда они вам больше не нужны.

+7

«Это, вероятно, не имеет значения для вашей домашней работы» - я не уверен: похоже, что профессор настраивает его на это! –

Смежные вопросы