1 / 29

Informática II

Informática II. Clase 14: Espacios Nombres. Diego Fernando Serna Restrepo. Semestre 2011/2. Chiste del Día. Contenido. Creación de Espacios Nombres. 1. Usando Espacios Nombres. 2. Espacios Nombre estándar std. 3. Visibilidad. int globalScopeInt = 5 ; void f( ) {

khalil
Download Presentation

Informática II

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Informática II Clase 14: EspaciosNombres Diego Fernando Serna Restrepo Semestre 2011/2

  2. Chiste del Día Informática II 2011/2

  3. Contenido Creación de EspaciosNombres 1 UsandoEspaciosNombres 2 Espacios Nombre estándar std 3 Informática II 2011/2

  4. Visibilidad • intglobalScopeInt = 5 ; • void f( ) • { • intlocalScopeInt = 10 ; • } • intmain( ) • { • intlocalScopeInt = 15 ; • { • intanotherLocal = 20 ; • intlocalScopeInt = 30 ; • } • return 0 ; • } • Es usado para determinar el alcance de… ya sea una variable, una clase, una función. Informática II 2011/2

  5. Visibilidad • Cuando las variables son definidas en instancias (archivos cpp) diferentes: • // file first.cpp • intintegerValue = 0 ; • intmain( ) { • intintegerValue = 0 ; • // . . . • return 0 ; • } ; • // file second.cpp • intintegerValue = 0 ; • Intmain(){ • ….. • } • // end of second.cpp Sin embargo el Linker al tener acceso a ambos archivos cpp encontrará que se presenta una doble declaración de la variable integerValue con el mismo alcance. Si estas dos variables contaran con diferente alcance no habría problema. El compilador revisa cada archivo cpp de manera independiente por lo tanto no generara ningún error al respecto, por qué?. Informática II 2011/2

  6. El operador scope (::) Indicando que se está haciendo referencia a la variable integerValue global no local. Visibilidad • // file first.cpp • intintegerValue = 0 ; • intmain( ) • { • intintegerValue = 0 ; • ::integerValue = 10 ; //assignto global “integerValue” • // . . . • return 0 ; • } ; • // file second.cpp • intintegerValue = 0 ; • intmain(){ • …. • } • // end of second.cpp • A pesar de que en first.cpp se tiene dos variables definidas con el mismo nombre, cada una de ellas tiene vigencia sobre espacios diferentes del archivo. Dentro de la función main(), prima la variable local integerValue sobre la global. Qué pasa si deseo tener acceso a la variable global dentro del bloque del main()? Aunque el linker seguirá con el problema que encuentra 2 variables con el mismo nombre y mismo ámbito . Informática II 2011/2

  7. Enlace interno y externo de variables • // file: first.cpp • intexternalInt = 5 ; • constint j = 10 ; • intmain() • { • return 0 ; • } • // file: second.cpp • externintexternalInt ; • intanExternalInt = 10 ; • constint j = 10 ; El modificador extern permite un enlace externo Informática II 2011/2

  8. Enlace interno y externo de variables • // file: first.cpp • externconstint j = 10 ; • // file: second.cpp • externconstint j ; • #include <iostream> • intmain() • { • std::cout << “j is ” << j << std::endl ; • return 0 ; • } • El modificador const permite un enlace interno. Si la variable j no tuviera este modificador el linker mostraría un error por tener su definición en dos partes diferentes. Informática II 2011/2

  9. Creación de espacios de nombres • La forma de declarar un espacio de nombre es similar a como se hace con una clase, solo que no se coloca el ‘;’ al final de la misma, y todos sus miembros internos son públicos y puede ser accedidos sin restricciones. • namespace Window • { • void move( int x, int y) ; • } Un espacio de nombre puede contener todo tipo de miembros como funciones, clases, variables, constantes, e incluso otros espacios de nombres anidados. Informática II 2011/2

  10. Creación de espacios de nombres • // header1.h • namespace Window • { • void move( int x, int y) ; • } • // header2.h • namespace Window • { • void resize( int x, int y ) ; • } • La declaración de un espacio de nombre suele ser implementada en un archivo .h con el objetivo de poder incluirla fácilmente en los .cpp donde sea necesaria utilizar sus funcionalidades, o incluso se puede distribuir su declaración en numerosos archivos .h, de este modo varios programadores pueden crear sus respectivos .h independientemente, y luego unir sus funcionalidades y miembros bajo un mismo espacio de nombre. Informática II 2011/2

  11. Creación de espacios de nombres • namespace Window { • // . . . other declarations and variable definitions. • void move( int x, int y ) • { • if( x < MAX_SCREEN_X && x > 0 ) • if( y < MAX_SCREEN_Y && y > 0 ) • platform.move( x, y ) ; // specific routine • } • void resize( int x, int y ) • { • if( x < MAX_SIZE_X && x > 0 ) • if( y < MAX_SIZE_Y && y > 0 ) • platform.resize( x, y ) ; // specific routine • } • // . . . definitions continue • } Dentro del la declaración del espacio de nombre es posible definir las funciones, clases y variables sin embargo no es lo ideal pues hace el código menos portable y va en contra de las buenas técnicas de programación Informática II 2011/2

  12. Creación de espacios de nombres // file_header.h namespace Window { void move( int x, int y) ; // other declarations ... } Nuevos miembros puede ser adicionados pero solo dentro del cuerpo del espacio de nombre respectivo. • namespace Window { • // lots of declarations • } • //...some code • int Window::newIntegerInNamespace ; // sorry, can’t do this // file impl.cpp #include file_header.h void Window::move( int x, int y) { // code to move the window } Informática II 2011/2

  13. Anidando espacios de nombres • namespace Window { • namespace Pane { • void size( int x, int y ) ; • } • } Para accede a la función size() desde otra parte se debe especificar la ruta completa de espacios de nombres hasta llegar a su declaración. • int main( ) • { • Window::Pane::size( 10, 20 ) ; • return 0 ; • } Informática II 2011/2

  14. int Window::Pane::cnt = 0 ; • Window::Pane::Pane() : x(0), y(0) { } • Window::Pane::~Pane() { } • void Window::Pane::size( int x, int y ){ • if( x < Window::MAX_X && x > 0 ) • Pane::x = x ; • if( y < Window::MAX_Y && y > 0 ) • Pane::y = y ; • } • void Window::Pane::move( int x, int y ){ • if( x < Window::MAX_X && x > 0 ) • Pane::x = x ; • if( y < Window::MAX_Y && y > 0 ) • Pane::y = y ; • } • void Window::Pane::show( ){ • std::cout << "x " << Pane::x ; • std::cout << " y " << Pane::y <<std::endl; • } Ejemplo • #include <iostream> • // Listing 17.1 Using a Namespace • namespace Window • { • const int MAX_X = 30 ; • const int MAX_Y = 40 ; • class Pane • { • public: • Pane() ; • ~Pane() ; • void size( int x, int y ) ; • void move( int x, int y ) ; • void show( ) ; • private: • static intcnt ; • int x ; • int y ; • }; • } • int main( ) • { • Window::Pane pane ; • pane.move( 20, 20 ) ; • pane.show( ) ; • return 0 ; • } Informática II 2011/2

  15. Contenido Creación de EspaciosNombres 1 UsandoEspaciosNombres 2 Espacios Nombre estándar std 3 Informática II 2011/2

  16. Usando Espacios Nombres • La palabra clave using Informática II 2011/2

  17. Directiva • Una vez utilizada la palabra clave using, ya no se hace necesario escribir el espacio del nombre al cual pertenece la función o variable. • namespace Window { • int value1 = 20 ; • int value2 = 40 ; • } • . . . • Window::value1 = 10 ; • using namespace Window ; • value2 = 30 ; Informática II 2011/2

  18. Directiva Siempre tiene precedencia lo local sobre lo global • La valides de using, está contenida en el alcance donde se utilizo, es decir si se hace localmente solo tiene valides sobre esa porción del código, por fuera de esta ya no. • namespace Window { • int value1 = 20 ; • int value2 = 40 ; • } • //. . . • void f() • { • { • using namespace Window ; • value2 = 30 ; • } • value2 = 20 ; • } • namespace Window { • int value1 = 20 ; • int value2 = 40 ; • } • //. . . • void f() • { • int value2 = 10 ; • using namespace Window ; • std::cout <&l value2 <<std::endl ; • } Error La salida de este programa es 10 no 40 Informática II 2011/2

  19. Directiva • También es posible que se presenten ambigüedades, pero no se hacen evidentes sino al final, cuando se está haciendo uso directo de una variable declarada en el espacio de nombre y por fuera de este. • namespace Window { • int value1 = 20 ; • } • //. . . • using namespace Window ; • int value1 = 10 ; • void f( ) • { • value1 = 50 ; • } La ambigüedad se presenta cuando se entra a la función f(). Informática II 2011/2

  20. Declaración • El uso de using como declaración permite escoger campos específicos pertenecientes al namespace y darles la visibilidad o alcance que yo quiera. • namespace Window { • int value1 = 20 ; • int value2 = 40 ; • int value3 = 60 ; • } • //. . . • using Window::value2 ; //bring value2 into current scope • Window::value1 = 10 ; //value1 must be qualified • value2 = 30 ; • Window::value3 = 10 ; //value3 must be qualified Informática II 2011/2

  21. Declaración Informática II 2011/2

  22. Alias de espacios de nombre • Se debe tener cuidado que el sobrenombre (apodo o alias) no coincida con otro espacio de nombre declarado. • namespace the_software_company { • int value ; • // . . . • } • the_software_company::value = 10 ; • . . . • namespace TSC = the_software_company ; • TSC::value = 20 ; Informática II 2011/2

  23. Espacio de nombre sin nombre • // file: one.cpp • namespace { • int value ; • char p( char *p ) ; • //. . . • } • // file: two.cpp • namespace { • int value ; • char p( char *p ) ; • //. . . • } • int main( ) • { • char c = p( ptr ) ; • } • Como su nombre lo indica, son aquellos espacios de nombres que no son declarados mediante un nombre en particular No se puede tener acceso a un espacio de nombre sin nombre desde un archivo .cpp diferente de donde se declaro inicialmente. Sólo tienen una connotación local Informática II 2011/2

  24. Contenido Creación de EspaciosNombres 1 UsandoEspaciosNombres 2 Espacios Nombre estándar std 3 Informática II 2011/2

  25. Espacio de nombre estándar std • #include <iostream> • using namespace std ; • La librería estándar de C++ está totalmente contenida en el espacio de nombre llamado std. Todas las funciones, objetos, constantes del lenguaje son declarados en esta. Lo ideal sería declarar justamente lo que se necesita o va a ser utilizado. • #include <iostream> • using std::cin ; • using std::cout ; • using std::endl ; • int main( ) • { • int value = 0 ; • cout << “So, how many eggs did you say you wanted?” << endl ; • cin >> value ; • cout << value << “ eggs, sunny-side up!” << endl ; • return( 0 ) ; • } Informática II 2011/2

  26. Espacio de nombre estándar std • #include <iostream> • int main( ) • { • int value = 0 ; • std::cout << “How many eggs did you want?” << std::endl ; • std::cin >> value ; • std::cout << value << “ eggs, sunny-side up!” << std::endl ; • return( 0 ) ; • } Informática II 2011/2

  27. GRACIAS POR SU ATENCIÓN Informática II 2011/2

  28. Bibliografía • Pagina de Referencia lenguaje C++: • http://www.cplusplus.com/reference/iostream/ • SamsTeach yourselft C++ in 21 days: http://newdata.box.sk/bx/c/htm/ch20.htm#Heading1 Informática II 2011/2

  29. Gracias ! Informática II 2009/2

More Related