2010-05-17 5 views
12

Pour mon dernier devoirs CS, je suis tenu de créer une classe appelée film qui détient le titre, directeur, année, note, acteurs, etc.C++ Vecteur de pointeurs

Ensuite, je suis obligé de lire un fichier qui contient une liste de cette information et la stocker dans un vecteur de pointeurs vers des films.

Je ne suis pas sûr de ce que signifie la dernière ligne. Est-ce que cela signifie, j'ai lu le fichier, créer plusieurs objets Movie. Puis faire un vecteur de pointeurs où chaque élément (pointeur) pointe vers l'un de ces objets Movie? Est-ce que je fais juste deux vecteurs - un de pointeurs et un de films et de faire un mappage un-à-un des deux vecteurs?

Répondre

29

Cela signifie quelque chose comme ceci:

std::vector<Movie *> movies; 

Ensuite, vous ajoutez au vecteur que vous lisez les lignes:

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

Rappelez-vous de supprimer tous les Movie* objets une fois que vous avez terminé avec le vecteur .

+0

+! Yep - c'est ce que j'ai pris de la question aussi –

+0

Si je crée un vecteur d'ints, je dois repousser un int. Si c'est un vecteur de bool, je repousse un bool. Dans votre relevé, est-ce que je repousse un objet Movie ou un pointeur Movie? – xbonez

+0

Vous repoussez un pointeur vers un objet Film (nouvellement créé). – schnaader

1

Je ne suis pas sûr de ce que signifie la dernière ligne. Est-ce que cela signifie, j'ai lu le fichier, créer plusieurs objets Movie. Puis faire un vecteur de pointeurs où chaque élément (pointeur) pointe vers l'un de ces objets Movie?

Je suppose que c'est ce qui est prévu. L'intention est probablement que vous lisez les données pour un film, allouer un objet avec new, remplissez l'objet avec les données, puis poussez l'adresse des données sur le vector (probablement pas le meilleur design, mais très probablement ce qui est prévu en tous cas).

+0

Non, je pense que ce qui est poussé sur le vecteur est en fait le pointeur. ie 'movies.push (nouveau film()); movies.back() -> getData(); 'ou quelque chose. – Cam

+0

@incrediman: Oups, tout à fait raison. Mes doigts ont sauté quelques mots pendant que je tapais ... –

9

Pour autant que je comprends, vous créez une classe Movie:

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

et ayant cette classe, vous créez une instance de vecteur:

std::vector<Movie*> movies; 

, vous pouvez ajouter tout film à votre collection de films. Puisque vous créez un vecteur de pointeurs vers des films, ne pas oublier de libérer les ressources allouées par vos instances de film ou vous pouvez utiliser un pointeur intelligent pour désaffecter les films automatiquement:

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

Ou encore mieux utiliser 'std :: vector >' si le vecteur est le seul objet qui maintient la durée de vie des objets 'Movie' –

+1

Cela devrait être la réponse acceptée – pistacchio

1

En allouant dynamiquement un objet vidéo avec new Movie(), vous obtenez un pointeur vers le nouvel objet. Vous n'avez pas besoin d'un second vecteur pour les films, il suffit de stocker les pointeurs et vous pouvez y accéder. Comme Brian a écrit, le vecteur serait défini comme

std::vector<Movie *> movies

Mais il faut savoir que le vecteur ne supprimera pas après vos objets, ce qui se traduira par une fuite de mémoire. Cela n'a probablement pas d'importance pour vos devoirs, mais normalement vous devriez supprimer tous les pointeurs quand vous n'en avez plus besoin.

+7

"Cela n'a probablement pas d'importance pour vos devoirs" - je ne suis pas si sûr - on dirait que le prof est en train de le préparer pour ça !!! –