2012-07-02 13 views
12

Sto cercando di imparare C++ e mi sono imbattuto in un errore mentre cercavo di capire l'ereditarietà.Eredità molto di base: errore: nome classe previsto prima del token '{'

Compilazione: daughter.cpp In inclusi file da /home/jonas/kodning/testing/daughter.cpp:1: /home/jonas/kodning/testing/daughter.h:6: errore: classe- previsto nominare prima di '{' token processo terminato con stato 1 (0 minuti, 0 secondi) 1 errori, 0 avvertimenti

miei file: 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 

e daughter.cpp:

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

#include <iostream> 

using namespace std; 


daughter::daughter() 
{ 
    //ctor 
} 

Quello che voglio fare è quello di lasciare la figlia ereditare tutto pubblico dalla classe madre (= saywhat()). Che cosa sto facendo di sbagliato?

+0

Inoltre non è necessario includere 'daughter.h' nel' mother.h' o 'mother.cpp'. Hai quasi inchiodato l'ereditarietà, apporta le modifiche suggerite e dovresti essere pronto. – nikhil

+0

Un suggerimento per la convenzione C++, come dici tu stai solo imparando - la prima lettera dei nomi di classe è generalmente in maiuscolo. Non è un requisito, ma troverai una convenzione di codifica coerente. Inoltre, vedo che hai lasciato commenti positivi su alcune risposte qui sotto - per favore accetta la risposta che ti ha aiutato di più! Ci dovrebbe essere un segno di spunta accanto a ciascuna risposta, facendo clic su di esso lo accetterà. Grazie per aver contribuito a StackOverflow! – WendiKidd

risposta

18

si è dimenticato di includere mother.h qui:

#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 

è necessario includere questa intestazione, perché daughter è derivato dal mother. Quindi il compilatore deve conoscere la definizione di mother.

5

Prima di tutto, sono state incluse le protezioni nei file di implementazione. Rimuovili.

In secondo luogo, se si eredita da una classe, è necessario includere l'intestazione in cui è definita la classe.

+0

In realtà le guardie si trovano solo nel file '.h'. Penso che abbia un errore di battitura: il primo 'daughter.cpp' dovrebbe essere' daughter.h' in realtà. – Nawaz

+1

@Nawaz si, penso che tu abbia ragione. Ho appena visto cpp e includo le guardie :) –

5

In daughter.cpp, passare le due righe di include. vale a dire

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

Era successo che il compilatore sta esaminando la definizione della classe di daughter e non riusciva a trovare la definizione della classe base mother. Quindi si sta dicendo che "Mi aspetto l'identificatore mother di fronte a '{' nella riga

class daughter: public mother { 

ad essere una classe, ma non riesco a trovare la sua definizione!"

In mother.cpp, rimuovere l'inclusione di daughter.h. Il compilatore non ha bisogno di conoscere la definizione di daughter.h; ad esempio la classe mother può essere utilizzata senza daughter. Aggiungendo l'inclusione di daughter.h si introduce una dipendenza non necessaria tra le definizioni di classe.

D'altra parte, è sempre meglio IMHO mantenere l'inclusione dell'intestazione nella definizione della classe (.cpp) e non della dichiarazione della classe (.h).In questo modo è meno probabile che tu debba risolvere l'incubo dell'inclusione nell'intestazione quando includi intestazioni che a loro volta includono altre intestazioni che non hai il controllo. Ma molti codici di produzione includono l'intestazione nell'intestazione. Entrambi sono corretti, devi solo fare attenzione quando lo fai.

+0

Capito. Grazie mille a tutti. Sei tutto meraviglioso! – Jonas

Problemi correlati