ocultar espacios de nombres en C++

He leído algunas respuestas a otras preguntas similares sobre SO que parecían indicar que era posible ocultar un espacio de nombres (con el fin de ocultar los detalles de implementación), pero no dijeron cómo.

Entonces, por ejemplo, si quisiera un namespace A que contenía un namespace B y B tenía algunos detalles de implementación desagradables para las funciones en A que quería ocultar al usuario final, ¿hay algún tipo de truco del enlazador que pueda usar para que B no es visible fuera de A, pero A sigue siendo visible para el resto del programa?

preguntado el 03 de julio de 12 a las 23:07

Creo que el único "truco" involucrado aquí es "evitar poner B en el archivo de cabecera". -

No nombre el espacio de nombres "B", asígnele el nombre "Internal_B" :-) -

... evitar poner B en el archivo de encabezado? ¿Qué significa eso exactamente? Tengo que ponerlo en alguna parte... -

o bien use clase B y funciones estáticas privadas -

Uso la convención de que cualquier espacio de nombres cuyo nombre termine con detail es privado (al igual que lo hace Boost). Si el usuario final lo toca y se quema, o cambio algo y descifro su código, no me importa. -

2 Respuestas

El propósito de los espacios de nombres es evitar los conflictos de nombres. Eso es esencialmente todo. No proporcionan ninguna función para ocultar nada. Aunque en cierta medida obligan a escribir namesp_name::sometinng. Esto puede hacer que el usuario piense si vale la pena hacerlo o no.

Lo que sugieren los comentarios anteriores es básicamente dividir su encabezado en un encabezado público y un encabezado privado. El encabezado privado se incluye solo en su archivo cpp y no se espera que se incluya en el código de la capa superior. Esto funciona en muchos casos y es útil, pero no resuelve todos los problemas.

Respondido 04 Jul 12, 00:07

¿A qué te refieres cuando dices "pero no resuelve todos los problemas"? ¿Significa eso que si namespace B solo se define en los archivos cpp para mi A espacio de nombres, B seguirá siendo accesible desde fuera de esos dos lugares? - miguel dorst

"No resuelve todos los problemas" se refiere al concepto de archivos de encabezado públicos y privados. Este concepto en sí no tiene nada que ver con los espacios de nombres. - Kirill Kobelev

Cuando se compila el programa, todo lo que es visible proviene solo de los archivos de encabezado que se incluyen en la compilación actual. No se puede acceder a la información de archivos de objetos anteriores o de archivos de encabezado que se incluyeron en otro lugar. - Kirill Kobelev

"archivos de encabezado públicos y privados"? No sabía que existía algo así como un "archivo de encabezado privado". ¿Cuál sería el comportamiento de tal cosa? - miguel dorst

En caso de que su implementación contenga más de un archivo cpp, tiene sentido crear un encabezado privado. - Kirill Kobelev

De lo que parece estar hablando es de un patrón "Pimpl" y/o lenguaje de manejo/cuerpo. O algunos otros nombres que se te ocurran. Un ejemplo muy breve de esto está en alza Puntero inteligente página. Explica cómo puede declarar una clase con un tipo incompleto en un puntero inteligente y luego definir la implementación en otro lugar. Esto lo "oculta" de un usuario de la API, ya que la implementación de la clase "interna" puede cambiar sin que nadie la vuelva a compilar, excepto el creador de la biblioteca, porque el tamaño está solo en las implementaciones, no en los archivos de encabezado. Solo se conoce el tamaño de la clase "pública" y permanece constante. Lea los dos archivos .cpp y el único archivo .hpp y vea si tiene sentido por qué funciona.

Espero que esté relacionado con lo que estás tratando de hacer.

Respondido 04 Jul 12, 00:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.