Espacios de nombres C++ y definición de clases en archivos separados


Quiero crear un espacio de nombres que contenga varias clases como parte de un "paquete".

¿tengo que 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 todavía puedo separarlos en encabezado separado (.h) archivos y hacer que sean parte del espacio de nombres?

Pseudo ejemplo:

Dos motores.h

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

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

En lugar de hacer eso, quiero que Canvas y Primitive sean suyos .h archivos y sólo de alguna manera el estado que son parte de ese espacio de nombres.

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

Author: Taryn, 2010-11-04

3 answers

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 y cuando 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
    };
}
 29
Author: Alex B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-04 02:31:23

Los espacios de nombres pueden no ser contiguos. Puede aprovechar esto manteniendo clases relevantes en su 2DEngine.h que probablemente va a ser utilizado por el código del cliente y se enviará como parte de su biblioteca.

Cualquier otra cosa que no sea revelada al mundo exterior puede ser puesta en el mismo espacio de nombres pero en un archivo de cabecera separado (que no es enviado).

Cabecera H1.h (parte de la interfaz de la biblioteca con el mundo externo)

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

Cabecera H2.h (no parte de la interfaz de la biblioteca con el mundo externo)

#include "H1.h"
namespace TwoEngine      // reopen the namespace and extend it
{
    class Primitive 
    { 
        // Define all of Primitive here 
    }; 
}
 3
Author: Chubsdad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-04 02:31:45

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

 0
Author: Preet Sangha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-04 02:32:03