2009-06-15 9 views
14

Sono nuovo di C++, in modo da questa domanda può essere di base:Due classi che fanno riferimento gli uni agli altri

Ho due classi che hanno bisogno di fare riferimento a vicenda. Ciascuno è nel proprio file di intestazione e # include è il file di intestazione dell'altro. Quando provo a compilare viene visualizzato l'errore "ISO C++ vieta la dichiarazione di 'Foo' senza tipo" per una delle classi. Se cambio le cose così l'intestazione opposta viene analizzata per prima ottengo lo stesso errore con l'altra classe.

E 'possibile in C++ avere due classi che richiedono riferimenti l'una all'altra?

Per ulteriori dettagli: Ho una classe "App" e una classe "Window". L'app deve fare riferimento a Window per creare la finestra. La finestra ha un pulsante che richiama l'app, quindi ha bisogno di un riferimento all'app. Se non posso avere due classi si riferiscono a vicenda, c'è un modo migliore per implementare questo?

+2

Va notato che le reciproche dipendenze dovrebbero essere evitate quando possibile. Avrebbe senso considerare la funzionalità con cui i pulsanti chiamano nell'app in un oggetto ish del controllore separato? –

+0

Trovo questo problema abbastanza spesso nei miei piccoli giochi. Ho un oggetto Mondo contenente oggetti di gioco che devono fare riferimento all'oggetto Mondo per es. Rilevamento delle collisioni. Non ho trovato un buon modo di refactoring. (E btw, svegliando una discussione di 7 anni dovrebbe guadagnarmi una sorta di badge) – Johan

risposta

27

È possibile utilizzare le dichiarazioni di inoltro nei file di intestazione per aggirare le dipendenze circolari purché non siano presenti dipendenze di implementazione nelle intestazioni. In Window.h, aggiungere questa riga:

class App; 

In App.h, aggiungere questa riga:

class Window; 

aggiungere queste righe prima che le definizioni di classe.

Quindi nei file di origine è possibile includere le intestazioni per le definizioni di classe effettive.

Se le definizioni di classe fanno riferimento ai membri dell'altra classe (ad esempio, in linea), devono essere spostati nel file di origine (non più in linea).

8

Inoltra la dichiarazione è la strada da percorrere.

Se si utilizzano puntatori \ riferimento nell'intestazione della classe, la dichiarazione di inoltro su entrambi i lati potrebbe funzionare correttamente.

Se si sta creando l'oggetto come membro della classe, è necessario includere l'intestazione stessa. (La dichiarazione di inoltro non funzionerà in quanto il compilatore richiede la definizione della classe per conoscere la dimensione).

Refer C++ FAQ for solving such senario:

Se si sta creando la finestra come membro quindi includere l'intestazione della finestra in App, ma allo stesso tempo finestra non dovrebbe includere l'intestazione della App. Usa la combinazione di puntatore ad App e la dichiarazione di andata lì.

Problemi correlati