2010-11-04 15 views
19

Quiero hacer un espacio de nombres que contendrá varias clases como parte de un "paquete".espacios de nombres C++ y clases de definición en archivos separados

¿Debo declarar todas las clases dentro del espacio de nombres?

Por ejemplo, si tengo un "2dEngine.h" que define el espacio de nombres 2dEngine, ¿tengo que declarar todas las clases individuales dentro de ese archivo de encabezado? ¿O puedo separarlos en archivos de encabezado separados (.h) y hacer que formen parte del espacio de nombres?

Pseudo ejemplo:

TwoEngine.h

namespace TwoEngine 
{ 
    class Canvas 
    { 
     // Define all of Canvas here 
    }; 

    class Primitive 
    { 
     // Define all of Primitive here 
    }; 
} 

lugar de hacer eso, quiero tener la lona y primitivo ser sus propios archivos .h y apenas alguna manera afirmar que son parte de ese espacio de nombres

Lo siento, todavía soy bastante nuevo en esto.

Respuesta

25

Sí, puede dividir el espacio de nombres en varios bloques (y, por lo tanto, archivos). Sus clases pertenecerán al mismo espacio de nombres siempre que se declaren en el bloque namespace con el mismo nombre.

// Canvas.h 
namespace TwoEngine 
{ 
    class Canvas 
    { 
     // Define all of Canvas here 
    }; 
} 

// Primitive.h 
namespace TwoEngine 
{ 
    class Primitive 
    { 
     // Define all of Primitive here 
    }; 
} 
3

Los espacios de nombre pueden ser poco contiguos. Puede aprovechar esto al mantener clases relevantes en su 2DEngine.h que probablemente será utilizado por el código del cliente y que se enviará como parte de su biblioteca.

Cualquier otra cosa que no se revele al mundo exterior aún se puede poner en el mismo espacio de nombres pero en un archivo de encabezado separado (que no se envía).

Cabecera H1.h (parte de la interfaz de biblioteca para el mundo exterior)

namespace TwoEngine 
{ 
    class Canvas 
    { 
     // Define all of Canvas here 
    }; 
} 

Cabecera H2.h (no forma parte de la interfaz de biblioteca para el mundo exterior)

#include "H1.h" 
namespace TwoEngine  // reopen the namespace and extend it 
{ 
    class Primitive 
    { 
     // Define all of Primitive here 
    }; 
} 
0

Sí simplemente use la directiva de espacio de nombres dentro de los archivos de implementación también.

Cuestiones relacionadas