2010-02-24 25 views
16

Tengo la siguiente estructura:C++ Punteros. ¿Cómo asignar valor a una estructura de puntero?

typedef struct{ 
    int vin; 
    char* make; 
    char* model; 
    int year; 
    double fee; 
}car; 

Luego de crear un puntero del tipo de coche

car *tempCar; 

¿Cómo puedo asignar valores a la tempCar? Tengo problemas

 tempCar.vin = 1234;   
     tempCar.make = "GM"; 
     tempCar.year = 1999; 
     tempCar.fee = 20.5; 

El compilador sigue diciendo que tempCar es del tipo coche *. No estoy seguro de lo que estoy haciendo mal

Respuesta

25

Es necesario utilizar el operador -> sobre los punteros, así:

car * tempCar = new car(); 
tempCar->vin = 1234; 
tempCar->make = "GM"; 
//... 
delete tempCar; 

Además, no se olvide asigna memoria para tempCar si estás usando un puntero como este. Eso es lo que hacen 'nuevo' y 'eliminar'.

+3

+1 por el recordatorio para asignar la memoria –

+3

No necesariamente tiene que asignar memoria aquí. El puntero puede estar apuntando a una estructura local en la pila. 'coche ferrari; tempCar = & ferrari; ' – Seth

+0

Tenga en cuenta que probablemente sea el código C debido a la estructura explícitamente typedef'd. – alternative

5

tempCar->vin = 1234

La explicación es muy sencilla: car* es un puntero en car. Significa que debe usar el operador -> para acceder a los datos. Por cierto, debe asignarse car* si desea usarlo.

La otra solución es usar una declaración como car tempCar;. La estructura car está ahora en la pila, puedes usarla mientras estés en este ámbito. Con este tipo de declaración, puede usar tempCar.vin para acceder a los datos.

+0

Declarar una instancia (como con coche ** tempCar; **) puede ser fácilmente en la pila y no es necesariamente estática * * – NVRAM

+0

que sé mi oración no era clara, me refería a la asignación estática en oposición a una asignación dinámica :) gracias –

12

Tienes que eliminar la referencia del puntero primero (para obtener la estructura).

O bien:

(*tempCar).make = "GM"; 

O:

tempCar->make = "GM"; 
1

Su tempCar es un puntero, entonces usted tiene que asignar memoria para él y asignar así:

tempCar = new car(); 
tempCar->vin = 1234;   
tempCar->make = "GM"; 
tempCar->year = 1999; 
tempCar->fee = 20.5; 

declaran lo contrario tempCar de esta manera: car tempCar;

-2

personas, tener cuidado al usar nueva, esto no es Java, es C++, no use paréntesis cuando no tenga parámetros: tempCar = new car;

+2

¿Por qué "ten cuidado"? Es un problema de estilo y definitivamente estoy en desacuerdo: use los parens. – NVRAM

+2

No es un problema de estilo. Con paréntesis, los miembros en un tipo de POD serán construidos por defecto.Los paréntesis son generalmente preferidos, en mi experiencia. – GManNickG

-1

Cambiar su coche * temperatura por debajo de la línea:

car *tempCar = (car *)malloc(sizeof(car)); 

tempCar->vin = 1234;   
tempCar->make = "GM"; 
tempCar->year = 1999; 
tempCar->fee = 20.5; 
+0

comportamiento indefinido de acuerdo con el estándar C++. 'new' se debe usar para la asignación de memoria dinámica bruta en C++, no malloc. –

Cuestiones relacionadas