Dichiarare in avanti il ??typedef pubblico di una classe in c ++
-
08-07-2019 - |
Domanda
Sto provando a semplificare un mucchio di file di intestazione " include spaghetti " usando le dichiarazioni forward e spostando #includes nel file di implementazione. Tuttavia, continuo a seguire il seguente scenario:
//Foo.h
#include "Bar.h"
class Foo
{
public:
void someMethod(Bar::someType_t &val);
};
//Bar.h
.
.
.
class Bar
{
public:
typedef std::vector<SomeClass> someType_t;
};
Voglio rimuovere #include " Bar.h " nel maggior numero possibile di casi. Vedo anche la situazione in cui il typedef in Bar.h è elencato al di fuori della classe Bar. Presumo che entrambe le situazioni possano essere affrontate allo stesso modo.
Qualche idea?
Soluzione
Sfortunatamente non hai molte scelte e nessuna è perfetta.
Innanzitutto, le due soluzioni ovvie e inaccettabili:
- Puoi inoltrare il
typedef
che sconfigge totalmente lo scopo di usare untypedef
. - Includi il file che contiene il
typedef
, che vuoi evitare.
Le soluzioni più interessanti:
- Avere tutti i
typedef
associati nella stessa inclusione e includere quel file. Questo crea però un accoppiamento di codice tra le classi. Dovresti farlo solo con le classi correlate, altrimenti finirai con un dio include il file e questo potrebbe portare a una grande ricompilazione quando aggiungi untypedef
a quel file. - Per ogni classe, includere un'inclusione separata con
typedef
. Un po 'fastidioso, ma funziona.
Questi ultimi due sono come fare dichiarazioni in avanti ma con l'aggiunta di typedef
. Riducono le interdipendenze dei file poiché raramente si modifica il file typedef.
Direi che per la maggior parte delle situazioni, l'inclusione centrale ha il maggior beneficio per la seccatura. Stai solo attento.
Altri suggerimenti
Basta usare class Bar;
. Questo dice a C ++ che stai dichiarando la tua intenzione di definire Bar.