2012-07-02 22 views
12

Estoy tratando de aprender C++ y me encontré con un error al tratar de descifrar la herencia.Herencia muy básica: error: class-name esperado antes de '{' token

Compilación: daughter.cpp En el archivo incluído en /home/jonas/kodning/testing/daughter.cpp:1: /home/jonas/kodning/testing/daughter.h:6: Error: se esperaba de clase nombre en presencia de '{' token de Proceso terminado con el estado 1 (0 minutos, 0 segundos) 1 errores, 0 cuidado

Mis archivos: mAIN.CPP:

#include "mother.h" 
#include "daughter.h" 
#include <iostream> 
using namespace std; 

int main() 
{ 
    cout << "Hello world!" << endl; 
    mother mom; 
    mom.saywhat(); 
    return 0; 
} 

mother.cpp:

#include "mother.h" 
#include "daughter.h" 

#include <iostream> 

using namespace std; 


mother::mother() 
{ 
    //ctor 
} 


void mother::saywhat() { 

    cout << "WHAAAAAAT" << endl; 


} 

mother.h:

#ifndef MOTHER_H 
#define MOTHER_H 


class mother 
{ 
    public: 
     mother(); 
     void saywhat(); 
    protected: 
    private: 
}; 

#endif // MOTHER_H 

daughter.h:

#ifndef DAUGHTER_H 
#define DAUGHTER_H 


class daughter: public mother 
{ 
    public: 
     daughter(); 
    protected: 
    private: 
}; 

#endif // DAUGHTER_H 

y daughter.cpp:

#include "daughter.h" 
#include "mother.h" 

#include <iostream> 

using namespace std; 


daughter::daughter() 
{ 
    //ctor 
} 

Lo que quiero hacer es dejar que la hija hereda todo público de la clase madre (= saywhat()). ¿Qué estoy haciendo mal?

+0

Además, no es necesario que incluya 'daughter.h' en' mother.h' o 'mother.cpp'. Usted casi ha clavado la herencia, realice los cambios que le han sugerido y debería estar listo para continuar. – nikhil

+0

Un consejo de convención de C++, como dices que acabas de aprender: la primera letra de los nombres de las clases generalmente está en mayúscula. No es un requisito, pero encontrarás que es una convención de codificación consistente. Además, veo que has dejado comentarios positivos sobre algunas de las respuestas a continuación. ¡Acepta la respuesta que más te ha ayudado! Debería haber una marca de verificación al lado de cada respuesta, al hacer clic se aceptará. ¡Gracias por contribuir a StackOverflow! – WendiKidd

Respuesta

18

olvidó incluir mother.h aquí:

#ifndef DAUGHTER_H 
#define DAUGHTER_H 

#include "mother.h" //<--- this line is added by me.  

class daughter: public mother 
{ 
    public: 
     daughter(); 
    protected: 
    private: 
}; 

#endif // DAUGHTER_H 

es necesario incluir esta cabecera, porque daughter se deriva de mother. Entonces el compilador necesita saber la definición de mother.

5

En primer lugar, debe incluir guardias en los archivos de implementación. Eliminarlos.

Segundo, si heredas de una clase, necesitas incluir el encabezado donde está definida la clase.

+0

En realidad, las protecciones están en el archivo '.h' solamente. Creo que tiene un error tipográfico: la primera 'hija.cpp' se supone que es' hija.h' en realidad. – Nawaz

+1

@Nawaz, sí, creo que tienes razón. Acabo de ver cpp e incluir guardias :) –

5

En daughter.cpp, cambie las dos líneas de include. es decir,

#include "mother.h" 
#include "daughter.h" 

Lo que ocurrió fue que el compilador está mirando en la definición de la clase daughter y no podía encontrar la definición de la clase base mother. Por lo que te está diciendo que "estoy esperando el identificador mother frente a '{' en la línea

class daughter: public mother { 

a ser una clase, pero no puedo encontrar su definición!"

En mother.cpp, elimine la inclusión de daughter.h. El compilador no necesita conocer la definición de daughter.h; es decir, la clase mother se puede usar sin daughter. Agregar la inclusión de daughter.h introduce una dependencia innecesaria entre las definiciones de clase.

Por otro lado, siempre es mejor en mi humilde opinión mantener la inclusión del encabezado en la definición de la clase (.cpp) y no la declaración de la clase (.h).De esta forma, es menos probable que necesites resolver la pesadilla de inclusión del encabezado al incluir encabezados que a su vez incluyen otros encabezados de los que no tienes control. Pero muchos códigos de producción incluyen encabezado en el encabezado. Ambos son correctos, solo debes tener cuidado cuando hagas eso.

+0

Lo tengo. Muchas gracias a todos. ¡Eres todo maravilloso! – Jonas

Cuestiones relacionadas