2009-05-07 24 views
9

Estoy tratando de simplificar un grupo de archivos de encabezado "include spaghetti" mediante el uso de declaraciones forward y #includes en movimiento en el archivo de implementación. Sin embargo, sigo viniendo sobre el siguiente escenario:Reenviar declarar el typedef público de una clase en C++

//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; 
}; 

Quiero eliminar #include "Bar.h" en el mayor número posible de casos. También veo la situación en la que el typedef en Bar.h aparece en la lista fuera de la clase Bar. Supongo que ambas situaciones se pueden abordar de la misma manera.

¿Alguna idea?

+0

¿Es Bar realmente una clase o una plantilla? Las respuestas serán diferentes si Bar es una plantilla, es decir, si Bar no es única y, por lo tanto, Bar :: someType_t tampoco es única. –

Respuesta

8

Lamentablemente no tiene muchas opciones y ninguna es perfecta.

En primer lugar, las dos soluciones obvias e inaceptables:

  • Puede reenviar declarar la typedef lo que contradice totalmente el propósito de utilizar un typedef.
  • Incluye el archivo que contiene el typedef, que desea evitar.

Las soluciones más interesantes:

  • ¿Todos relacionados typedef s de la misma incluyen e incluyen ese archivo. Sin embargo, esto crea un acoplamiento de código entre las clases. Debería hacer eso solo con clases relacionadas, de lo contrario terminará con un archivo de inclusión de dios y esto podría llevar a una gran recompilación cuando agregue un typedef a ese archivo.
  • Para cada clase, tenga un include separado con el typedef s en él. Es un poco molesto, pero funciona.

Esas dos últimas son como hacer declaraciones directas pero con typedef s añadido. Reducen las interdependencias de archivos ya que rara vez se modifica el archivo typedef.

Yo diría que para la mayoría de las situaciones, la central incluye tiene el mayor beneficio para la molestia. Sólo sé cuidadoso.

+1

Creo que puedo realizar una cuarta opción: - Declaro el mismo typedef exacto en Foo.h Mi razonamiento es que Foo presenta su propia interfaz a los clientes, y es responsable de cómo se llaman sus propios métodos. El software del cliente no deberá incluir bar.h ni tener conocimiento de ello. Este nivel de encapsulación y bajo acoplamiento es el objetivo que estoy buscando. –

+0

Vaya. Quise decir quinta opción. –

-2

Simplemente use class Bar;. Eso le dice a C++ que estás declarando tu intención de definir Bar.

+1

Observe el typedef dentro de 'class Bar' ... este es el problema real, no la clase en sí misma, que podría abordarse mediante la declaración forward que usted sugirió. – Naaff

Cuestiones relacionadas