2010-05-17 23 views
12

para mi última tarea CS, tengo la obligación de crear un llamado Película clase que tiene el título, director, año, calificación, actores, etc.C++ vector de punteros

Entonces, estoy obligado a leer un archivo que contiene una lista de esta información y almacenarla en un vector de punteros a Películas.

No estoy seguro de qué significa la última línea. Significa que, leí el archivo, creé varios objetos de película. Luego, crea un vector de punteros en el que cada elemento (puntero) apunta a uno de esos objetos de la Película.

¿Acabo de hacer dos vectores, uno de los punteros y otro de Películas, y hacer un mapeo uno a uno de los dos vectores?

Respuesta

29

significa algo como esto:

std::vector<Movie *> movies; 

a continuación, agregar al vector a medida que lee las líneas:

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

Recuerde eliminar todos los Movie* objetos una vez que haya terminado con el vector .

+0

+! Sí, eso es lo que tomé de la pregunta también –

+0

Si creo un vector de ints, tengo que retroceder un int. Si es un vector de bool, empujo hacia atrás un bool. En su extracto, ¿retrotrajo un objeto de película o un puntero de película? – xbonez

+0

Está retrocediendo un puntero a un objeto de película (recién creado). – schnaader

1

No estoy seguro de lo que significa la última línea. Significa que, leí el archivo, creé múltiples objetos de película . Luego, crea un vector de punteros en el que cada elemento (puntero) apunta a uno de esos objetos de la Película.

Supongo que esto es lo que se pretende. La intención es probablemente que lea los datos de una película, asigne un objeto con new, complete el objeto con los datos y luego inserte la dirección de los datos en el vector (probablemente no sea el mejor diseño, pero muy probablemente lo que se pretende de todas formas).

+0

No, creo que lo que se está presionando en el vector es en realidad el puntero. es decir 'movies.push (nueva Película()); movies.back() -> getData(); 'o algo así. – Cam

+0

@incrediman: Vaya, de acuerdo. Mis dedos omitieron un par de palabras mientras escribía ... –

9

Por lo que yo entiendo, se crea una clase de película:

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

y teniendo dicha clase, se crea una instancia de Vector:

std::vector<Movie*> movies; 

es así, usted puede añadir cualquier película a su colección de películas. Puesto que usted está creando un vector de punteros a las películas, no se olvide de liberar los recursos asignados por las instancias de película o usted podría utilizar un poco de puntero inteligente desasignar las películas de forma automática:

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

O mejor aún use 'std :: vector >' si el vector es el único objeto que mantiene el tiempo de vida de los objetos 'Película' –

+1

Esto debería ser la respuesta aceptada – pistacchio

1

Al asignar dinámicamente un objeto de película con new Movie(), obtienes un puntero al nuevo objeto. No necesita un segundo vector para las películas, solo almacene los punteros y puede acceder a ellos. Al igual que Brian escribió, el vector se define como

std::vector<Movie *> movies

Pero tenga en cuenta que el vector no eliminará sus objetos después, lo que resultará en una pérdida de memoria. Probablemente no importe para su tarea, pero normalmente debería eliminar todos los punteros cuando ya no los necesite.

+7

"Probablemente no importe para su tarea" - No estoy tan seguro - ¡parece que el profesor lo está preparando para esto! –