2010-05-17 22 views
12

Für meine neueste CS Hausaufgaben, ich verpflichtet bin, eine Klasse namens Film zu schaffen, der Titel hält, Regie, Jahr, Bewertung, Schauspieler usw.C++ Vektor von Zeigern

Dann bin ich verpflichtet, eine Datei zu lesen, die enthält eine Liste dieser Informationen und speichern Sie sie in einem Vektor von Zeigern zu Filmen.

Ich bin mir nicht sicher, was die letzte Zeile bedeutet. Heißt das, ich lese die Datei, erstelle mehrere Movie-Objekte. Erstellen Sie dann einen Vektor mit Zeigern, wobei jedes Element (Zeiger) auf eines dieser Movie-Objekte zeigt?

Mache ich einfach zwei Vektoren - einer der Zeiger und einer der Filme und machen Sie eine Eins-zu-Eins-Zuordnung der beiden Vektoren?

Antwort

29

Es bedeutet etwas wie folgt aus:

std::vector<Movie *> movies; 

Sie dann auf den Vektor hinzufügen, wie Sie Zeilen lesen:

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

Denken Sie daran, all die Movie* Objekte zu löschen, sobald Sie mit dem Vektor getan werden .

+0

+! Yep - das ist, was ich aus der Frage auch genommen habe –

+0

Wenn ich einen Vektor von Ints erzeuge, muss ich einen Int zurückschieben. Wenn es ein Vektor von Bool ist, schiebe ich einen Bool zurück. Drücken Sie in Ihrer Aussage ein Movie-Objekt oder einen Movie-Pointer zurück? – xbonez

+0

Sie drücken einen Zeiger auf ein (neu erstelltes) Movie-Objekt. – schnaader

1

Ich bin mir nicht sicher, was die letzte Zeile bedeutet. Heißt das, ich lese die Datei, erstelle mehrere Filmobjekte. Erstellen Sie dann einen Vektor mit Zeigern, wobei jedes Element (Zeiger) auf eines dieser Movie-Objekte zeigt?

Ich würde vermuten, das ist, was beabsichtigt ist. Die Absicht ist wahrscheinlich, dass Sie die Daten für einen Film lesen, ein Objekt mit new zuweisen, das Objekt mit den Daten füllen und dann die Adresse der Daten auf die vector schieben (wahrscheinlich nicht das beste Design, aber wahrscheinlich das, was beabsichtigt ist sowieso).

+0

Nein, ich denke, was auf den Vektor geschoben wird, ist eigentlich der Zeiger. dh 'movies.push (neuer Film()); movies.back() -> getData(); 'oder so etwas. – Cam

+0

@incrediman: Ups, ganz richtig. Meine Finger übersprungen ein paar Worte, während ich tippte ... –

9

Soweit ich verstehe, Sie eine Filmklasse erstellen:

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

und solche Klasse ist, erstellen Sie einen Vektor Beispiel:

std::vector<Movie*> movies; 

so können Sie jeden Film hinzufügen Ihren Filmsammlung. Da Sie einen Vektor von Zeigern auf Filme erstellen, vergessen Sie nicht die Ressourcen, die von Ihrem Film Instanzen zugewiesen zu schaffen, oder könnten Sie einige Smart-Pointer verwenden, um die Filme ausplanen automatisch:

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

Oder besser noch 'std :: vector >' wenn der Vektor das einzige Objekt ist, das die Lebensdauer von 'Movie'-Objekten beibehalten –

+1

Dies sollte Sei die akzeptierte Antwort – pistacchio

1

Durch dynamisch ein Filmobjekt Zuweisung mit new Movie(), erhalten Sie einen Zeiger auf das neue Objekt. Sie brauchen keinen zweiten Vektor für die Filme, speichern Sie einfach die Zeiger und Sie können auf sie zugreifen. Wie Brian schrieb, würde der Vektor als

std::vector<Movie *> movies

Aber beachten Sie definiert werden, dass der Vektor Ihre Objekte später nicht gelöscht werden, die in einem Speicherverlust führen. Es ist wahrscheinlich nicht wichtig für Ihre Hausaufgaben, aber normalerweise sollten Sie alle Zeiger löschen, wenn Sie sie nicht mehr brauchen.

+7

"Es ist wahrscheinlich nicht wichtig für deine Hausaufgaben" - Ich bin mir nicht so sicher - es klingt wie der Prof ihn dafür aufbaut !!! –

Verwandte Themen