2010-05-20 13 views
11

Estoy trabajando en un programa de mi libro de texto C++, y esta es la primera vez que realmente tengo problemas. Simplemente no puedo ver lo que está mal aquí. Visual Studio me dice Error: el identificador "cadena" no está definido.La clase C++ no reconoce el tipo de datos de cadena

Separa el programa en tres archivos. Un archivo de cabecera para la especificación de clase, un archivo .cpp para la implementación de clase y el archivo de programa principal. Estas son las instrucciones de mi libro:

escribir una llamada de coches clase que tiene las siguientes variables miembro:

año. Un int que contiene el año modelo del automóvil.

make. Un string que contiene la marca del automóvil.

velocidad. Un int que mantiene la velocidad actual del automóvil.

Además, la clase debe tener las siguientes funciones de miembro.

Constructor. El constructor debe aceptar los argumentos year y make del coche como argumentos y asignar estos valores a las variables de miembro year y make del objeto. El constructor debe inicializar la variable de miembro speed en 0.

Accesorios. Deben crearse funciones de acceso apropiadas para permitir la recuperación de valores de las variables de miembro year, make y speed de un objeto.

Hay más instrucciones, pero no son necesarias para que esta pieza funcione.

Aquí está mi código fuente:

// File Car.h -- Car class specification file 
#ifndef CAR_H 
#define CAR_H 
class Car 
{ 
private: 
    int year; 
    string make; 
    int speed; 
public: 
    Car(int, string); 
    int getYear(); 
    string getMake(); 
    int getSpeed(); 
}; 
#endif 


// File Car.cpp -- Car class function implementation file 
#include "Car.h" 

// Default Constructor 
Car::Car(int inputYear, string inputMake) 
{ 
    year = inputYear; 
    make = inputMake; 
    speed = 0; 
} 

// Accessors 
int Car::getYear() 
{ 
    return year; 
} 

string Car::getMake() 
{ 
    return make; 
} 

int Car::getSpeed() 
{ 
    return speed; 
} 


// Main program 
#include <iostream> 
#include <string> 
#include "Car.h" 
using namespace std; 

int main() 
{ 

} 

no he escrito nada en el programa principal, sin embargo, porque no puedo conseguir la clase de compilar. Solo he vinculado el archivo de encabezado al programa principal. Gracias de antemano a todos los que se toman el tiempo de investigar este problema para mí.

+2

Soy bastante celoso de usar una ide para aprender C++ o codificar en general – Woot4Moo

+0

Simplemente estoy usando las herramientas actuales del tiempo que están disponibles para mí, al igual que estoy seguro de que lo hicieron cuando aprendieron. Me imagino que fue difícil aprender esto sin un programa que señale tus errores. Me imagino que sería igual a subir Mt. Everest antes de que las botas estuvieran disponibles. – reallythecrash

+0

Además, considere cambiar la declaración de 'Car :: Car (int inputYear, string inputMake)' a 'Car :: Car (const int inputYear, const std :: string & inputMake)'. Ver [aquí] (http://stackoverflow.com/questions/2878972/why-do-we-have-to-send-the-const-type-reference-instead-of-just-the-types-nam/2880783 # 2880783) para una explicación. – utnapistim

Respuesta

10

Ha olvidado #incluir el encabezado de cadena y necesita calificar completamente el uso de string a std::string, el código modificado debe ser.

// File Car.h -- Car class specification file 
#ifndef CAR_H 
#define CAR_H 

#include <string> 

class Car 
{ 
private: 
    int year; 
    std::string make; 
    int speed; 
public: 
    Car(int, string); 
    int getYear(); 
    std::string getMake(); 
    int getSpeed(); 
}; 
#endif 


// File Car.cpp -- Car class function implementation file 
#include "Car.h" 

// Default Constructor 
Car::Car(int inputYear, std::string inputMake) 
{ 
    year = inputYear; 
    make = inputMake; 
    speed = 0; 
} 

// Accessors 
int Car::getYear() 
{ 
    return year; 
} 

Se puede poner using namespace std; en la parte superior de Car.cpp y que le permitirá utilizar la cadena sin std :: calificador en ese archivo. Sin embargo, NO coloque uno de estos en el encabezado porque es muy malo.

Como nota siempre debe incluir todo lo que la declaración de clase necesita en el encabezado antes del cuerpo de la clase, nunca debe confiar en un archivo fuente del cliente que incluya un archivo (como <string>) antes de incluir su encabezado.

Con respecto a esta parte de su tarea:

Constructor. The constructor should accept the car's year and make as arguments and assign these values to the object's year and make member variables. The constructor should initialize the speed member variable to 0.

La mejor práctica es utilizar una lista de inicialización en el constructor, así:

// Default Constructor 
Car::Car(int inputYear, string inputMake) 
    : year(inputYear), 
    make(inputMake), 
    speed(0) 

{ 

} 
+0

Gracias radman. Pasé todo el día tratando de resolver esto. Calificando completamente el tipo de datos con std :: string y agregando #include al archivo Car.h hizo el truco. El libro que estoy usando nunca usó cadenas en ninguna de las clases de ejemplo o constructores, sin embargo, hacen una pregunta de revisión usando una cadena. No he leído nada sobre listas de inicializadores, pero hay un capítulo llamado "más sobre clases y programación orientada a objetos" más adelante en el libro. Tal vez lo encuentre allí. Gracias de nuevo. – reallythecrash

9

Debe usar el nombre completamente calificado std::string, o se olvidó de incluir el encabezado <string>. O ambos.

+0

Creo que ambos son necesarios. –

+0

Gracias por responder. Sí, ambos son necesarios. Aunque todavía no estoy claro por qué. Tal vez mi libro lo explique con más detalle más adelante. Solo estoy en la página 388 de 1095. :) – reallythecrash

4

sospecho que necesita su #include <string> en el parte superior del archivo, por encima de donde se utiliza el tipo string.

+0

Gracias Dan. Usar #include en el archivo de encabezado funcionó, pero como nota al margen todavía tenía que calificar completamente cualquier uso del tipo de datos de cadena con std :: string. Aprecio tu aporte. – reallythecrash

-3

Haciendo std::string funciona, pero es bastante engorroso para escribir cada vez. Para hacer que funcione para todas las cuerdas sin hacer std :: cada momento, basta con poner estas dos líneas de código en la parte superior de su archivo de cabecera:

#include <string>; 

using namespace std; 

y ya está bueno para ir!

+0

¡Bienvenido a StackOverflow! Utilice el espacio de "respuesta" para obtener respuestas; esto es un comentario Podrás publicar comentarios una vez que hayas ganado suficientes puntos de reputación. –

+1

-1 En realidad, nunca debes hacer eso – slaphappy

+2

-1, nunca hagas 'using namespace std;'. – Puppy

1

#include <string> NO funciona. Debería poner using namespace std ; arriba del código.

Cuestiones relacionadas