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?

È stato utile?

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 un typedef .
  • 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 un typedef 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top