2012-03-19 13 views
37

Estoy intentando compilar 2 clases en C++ con el siguiente comando:variable C++ tiene inicializador pero tipo incompleto?

g++ Cat.cpp Cat_main.cpp -o Cat

Pero recibo el siguiente error:

Cat_main.cpp:10:10: error: variable ‘Cat Joey’ has initializer but incomplete type

Podría alguien explicarme qué significa esto? Lo que básicamente hacen mis archivos es crear una clase (Cat.cpp) y crear una instancia (Cat_main.cpp). Aquí está mi código fuente:

Cat.cpp:

#include <iostream> 
#include <string> 

class Cat; 

using namespace std; 

int main() 
{ 
    Cat Joey("Joey"); 
    Joey.Meow(); 

    return 0; 
} 

Cat_main.cpp:

#include <iostream> 
#include <string> 

using namespace std; 

class Cat 
{ 
    public: 
     Cat(string str); 
    // Variables 
     string name; 
    // Functions 
     void Meow(); 
}; 

Cat::Cat(string str) 
{ 
    this->name = str; 
} 

void Cat::Meow() 
{ 
    cout << "Meow!" << endl; 
    return; 
} 
+1

No puede declarar objetos para las clases cuya definición aún no está visible. – iammilind

+0

¿Cómo lo haría visible? –

+3

@Ken: debe incluir el archivo de encabezado. –

Respuesta

33

se utiliza una declaración adelantada cuando se necesita un tipo completo.

Debe tener una definición completa de la clase para poder usarla.

La forma habitual de hacer esto es:

1) crear un archivo Cat_main.h

2) mover

#include <string> 

class Cat 
{ 
    public: 
     Cat(std::string str); 
    // Variables 
     std::string name; 
    // Functions 
     void Meow(); 
}; 

a Cat_main.h. Tenga en cuenta que dentro del encabezado eliminé using namespace std; y cadena calificada con std::string.

3) incluir este archivo en tanto Cat_main.cpp y Cat.cpp:

#include "Cat_main.h" 
+0

Entonces, ¿no puedo arrojar la definición de mi clase a un archivo diferente? –

+0

@Ken no, eso no es lo que dije. Lee la respuesta nuevamente –

+0

¿Definiría también las funciones para la clase en el archivo de encabezado? –

4

No se puede definir una variable de un tipo incompleto. Debe traer la definición completa de Cat en el alcance antes de puede crear la variable local en main. Le recomiendo que mueva la definición del tipo Cat a un encabezado e inclúyalo desde la unidad de traducción que tiene main.

+0

¿Debo poner mi clase 'Cat' en el archivo con' main'? –

+4

@Ken: no, debe leer un libro de introducción sobre C++ donde se explicará el concepto de encabezados y archivos de fuentes. –

+1

@Ken: cree un archivo de encabezado con la definición de la clase (y las guardas apropiadas), luego inclúyalo desde cat.cpp y cat_main.cpp. –

9

No está relacionado con el caso de Ken directamente, pero tal error también puede ocurrir si ha copiado .h archivo y se olvidó de cambiar #ifndef Directiva. En este caso, el compilador saltará la definición de la clase pensando que es una duplicación.

+1

Excelente comentario, creo que cubre la causa más frecuente del problema. Esto se debe a que copiar o renombrar el archivo de encabezado y olvidarse de la directiva #ifndef es complicado, mientras que otras respuestas se dirigen olvidando agregar la instrucción #include, que es un error trivial. – Vlad

1

Recibí un error similar y presioné esta página mientras buscaba la solución.

Con Qt, este error puede ocurrir si olvida agregar el paso QT_WRAP_CPP(...) en la compilación para ejecutar el compilador de metaobjetos (moc). Incluir el encabezado Qt no es suficiente.

Cuestiones relacionadas