2012-02-15 11 views
10

Supongamos que tiene una clase C++. Y hay un espacio de nombres que debería ser visible solo dentro de mi clase. ¿Qué hacer para eso?¿Puedo declarar "using namespace" dentro de una clase de C++?

class SomeClass 
{ 
    using namespace SomeSpace; 

public: 
    void Method1(); 
    void Method2(); 
    void Method3(); 
}; 

namespace SomeSpace 
{ 
    /*some code*/ 
}; 
+1

¿Qué quiere decir exactamente por visible? Los espacios de nombres no son algo así como privado/público. – KillianDS

+0

Una opción es poner la clase * dentro * del espacio de nombres. Si depende tanto de ese espacio de nombres, ¿por qué está afuera? –

+0

Posible duplicado de [¿Por qué no puedo poner una declaración de "uso" dentro de una declaración de clase?] (Https://stackoverflow.com/questions/2134844/why-cant-i-put-a-using-declaration-inside -a-class-declaration) –

Respuesta

7

using namespace X; se llama using directive y puede aparecer sólo en función de espacio de nombres y alcance, pero no ámbito de clase. Entonces, lo que estás tratando de hacer no es posible en C++. Lo mejor que puede hacer es escribir la directiva de uso en el alcance del espacio de nombres de esa clase, que puede no ser deseable.

Pensándolo bien, sin embargo, el análisis de sus palabras,

Suponga que tiene una clase de C++. Y hay un espacio de nombres que debería ser visible solo dentro de mi clase. ¿Qué hacer para eso?

Sugiero algo como lo siguiente, que no estoy seguro es lo que quieres.

class A 
{ 
public: 
    void Method1(); 
    void Method2(); 
    void Method3(); 

private: 

    class B 
    { 
     //public static functions here, instead of namespace-scope 
     // freestanding functions. 
     //these functions will be accessible from class A(and its friends, if any) 
     //because B is private to A 
    }; 

}; 
+0

Las clases anidadas pueden ser muy tentadoras por lo cómodas que parecen. Sin embargo, la principal desventaja, y creo que no reportada, de las clases anidadas es que, al igual que cualquier otro miembro de la clase, todos los miembros de la clase anidada tienen acceso completo a todos los miembros privados/protegidos de la clase adjunta. Para los casos (¿quizás la mayoría?) Donde ese no era el objetivo específico y la razón para usar clases anidadas, entonces básicamente rompen por completo la encapsulación. –

0

No, pero puede hacerlo así:

namespace SomeSpace 
{ 
    /*some code*/ 
}; 

using namespace SomeSpace; 

class SomeClass 
{ 

public: 
    void Method1(); 
    void Method2(); 
    void Method3(); 
}; 

Aunque no se recomienda, ya sea para aplicar la directiva espacio de nombres utilizando en los archivos de cabecera y, a menudo considerado como un mal estilo. Está bien incluir un archivo fuente (.cpp) de su clase.

Cuestiones relacionadas