1 Przestrzenie nazw. 2 Globalna przestrzeń nazw jest jedna W programach pisanych przez wiele osób, lub korzystających z bibliotek napisanych przez innych,

Slides:



Advertisements
Podobne prezentacje
Usługi sieciowe Wykład 9 VPN
Advertisements

Wstęp do programowania
Klasa listy jednokierunkowej Przekazywanie parametrów do funkcji
Dzisiejszy wykład Wyjątki.
Programowanie obiektowe
Programowanie obiektowe
1 Dzisiejszy wykład Klasa string wersja prosta wersja ze zliczaniem odwołań Wyjątki Specyfikator volatile.
Programowanie obiektowe PO PO - LAB 3 Wojciech Pieprzyca.
Static, const, volatile.
C++ w Objectivity Marcin Michalak s1744. Pomocne pakiety: Data Definition Language (DDL). Standard Template Library (STL). Active Schema.
argumenty wiersza poleceń: getopt
Java vs C# Michał Prządka Tomasz Nowak
STL - Standard Template Library Autor: Błażej Chodarcewicz rainbow.mimuw.edu.pl/~bc189380/STL/
OOPC++ - operatory1 Operatory class complex { private: double re, im; public: complex (double r, double i = 0) { re = r; im = i; } friend complex operator+
Model – View - Controler
GUI Struktury Spotkanie integracyjne Nazwa wydziału: EAIiE Nazwa katedry: Informatyka Miejsce i data prezentacji: Kraków,
ODE Zapytania. Pętla for (1) Do obiektów będących instancjami klas możemy uzyskać dostęp za pomocą pętli for Zakres tej pętli to wszystkie obiekty klasy.
Team Building Copyright, 2003 © Jerzy R. Nawrocki Requirements Engineering Lecture.
Testowanie oprogramowania metodą badania pokrycia kodu
Podstawy programowania PP – WYK2 Wojciech Pieprzyca.
Współprogramy Plan: Motywacja Składnia Scenariusz obiektu współprogramu Przykłady Producent – konsument ( instrukcja attach ) Czytelnik -pisarze ( instukcja.
142 JAVA – sterowanie i wątki public class A20 extends javax.swing.JApplet implements ActionListener { private int licznik = 0; private JTextField t =
#include #include main () { cout
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Tworzenie aplikacji sieciowych w języku Java Exceptions Prezentacja.
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Tworzenie aplikacji sieciowych w języku Java Threads Prezentacja.
Programowanie obiektowe W2
MS ASP.NET 2005/2006
Tadeusz Janasiewicz IT Group, Tadeusz Janasiewicz, WSUS, IT Group, r.
Programowanie obiektowe III rok EiT
Podstawy informatyki 2013/2014 Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
REKURENCJA.
Wczytywanie danych z klawiatury, komentarze, zmienne.
W ś wiecie ba ś ni Andersena In the world of Andersen.
PRZELICZNIK DŁUGOŚCI w programie NetBeans IDE autorzy: Michał Mrozek i Marcin Mrugała 2012.
Przekazywanie argumentów
Algorytmy rekurencyjne - przykład
db4o Kacper Skory Marcin Talarek
POLAND. we will take you on a journey during which you will learn something about us.
Zastosowanie osi symetrii i wielokątów w przyrodzie
Instrukcja for. Instrukcja warunkowa mgr inż. Agata Pacek.
PIO. Autor -Zofia Kruczkiewicz1 Wykład 1-część druga Wstęp do inżynierii oprogramowania. Cykle rozwoju oprogramowania (część biznesowa aplikacji) iteracyjno-rozwojowy.
Podstawy programowania
GLEBA Opracował: Anna Pietruszka.
KINECT – czyli z czym to się je?. Damian Zawada
Opracowała: Iwona Kowalik
Budowa programu #include /*instrukcje preprocesora */ #include int main(void) { /*podstawowa funkcja programu */ int a=1; /*deklaracja i inicjalizacja.
Warsztaty użytkowników programu PLANS – Karwia06 Język makropoleceń JMP programu PLANS Część I mgr inż. Tomasz Zdun.
Die Farben der Sprachen Legenda The colours of the languages
Magic Janusz ROŻEJ Komtech Sp. z o.o.
Programowanie obiektowe 2013/2014 Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
TROCHĘ HISTORII Marek Zając PO CO UŻYWAĆ OPENCL? Marek Zając.
Algorytm testujący czy liczba jest liczbą pierwszą czy złożoną
Składnia pętli do … while do instrukcja while (wyrażenie); gdzie: instrukcja – instrukcja pojedyncza lub blok instrukcji wyrażenie – wyrażenie przyjmujące.
Programowanie strukturalne i obiektowe C++
Programowanie strukturalne i obiektowe C++
Wydział Elektroniki Kierunek: AiR Zaawansowane metody programowania Wykład 6.
Programowanie strukturalne i obiektowe C++
Programowanie strukturalne i obiektowe C++
Programowanie strukturalne i obiektowe C++ Przeładowanie operatorów Robert Nowak.
Kurs języka C++ – wykład 4 ( )
K URS JĘZYKA C++ – WYKŁAD 1 ( ) Łagodne wprowadzenie do języka C++
Programowanie strukturalne i obiektowe C++ Powtórzenie wiadomości z C++ Robert Nowak.
Wykład 2 Klasa Zesp i jej hermetyzacja 1.Przykład definicji klasy Zesp 2.Zmiana definicji klasy 3.Zmienne i funkcje statyczne PO2-1 / 28.
Wykład 5 Klasa Vec i jej operatory 1.Kategorie operatorów 2.Operatory ogólne - przykłady 3.Operatory specjalne [ ], ( ) oraz –> 4.Operatory new i delete.
Wykład 8 Polimorfizm 1.Funkcje polimorficzne 2.Czyste funkcje wirtualne i klasy abstrakcyjne PO8-1 / 38.
Switch. Instrukcja switch Składnia instrukcji: switch (wyrażenie){ case wyrażenie_stałe1: ciąg instrukcji dla wariantu 1; break; case wyrażenie_stałe2:
Podstawy informatyki Operatory rzutowania Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały.
Co Pan robi? Kim Pani jest? This project has been funded with support from the European Commission. This document reflects the views only of the authors,
Programowanie obiektowe Wykład 10
Previously discusses: different kinds of variables
Zapis prezentacji:

1 Przestrzenie nazw

2 Globalna przestrzeń nazw jest jedna W programach pisanych przez wiele osób, lub korzystających z bibliotek napisanych przez innych, istnieje ryzyko kolizji nazw Tradycyjnie problem rozwiązuje się przy pomocy prefiksów unikatowych dla każdej biblioteki // library1.h const double LIB_VERSION = 1.204; // library2.h const int LIB_VERSION = 3; // main.c #include // library1.h const double library1_LIB_VERSION = 1.204; // library2.h const int library2_LIB_VERSION = 3;

3 Przestrzenie nazw Zasadniczo przestrzenie nazw zastępują prefiksy identyfikatorów Zamiast piszemy: const double sdmBOOK_VERSION = 2.0;// in this library, class sdmHandle {... }; // each symbol begins sdmHandle& sdmGetHandle(); // with "sdm" namespace sdm { const double BOOK_VERSION = 2.0; class Handle {... }; Handle& getHandle(); }

4 Użycie przestrzeni nazw void f1() { using namespace sdm; // make all symbols in sdm // available w/o qualification // in this scope cout << BOOK_VERSION;// okay, resolves to sdm::BOOK_VERSION... Handle h = getHandle(); // okay, Handle resolves to // sdm::Handle, getHandle... // resolves to sdm::getHandle } void f2() { using sdm::BOOK_VERSION; // make only BOOK_VERSION // available w/o qualification // in this scope cout << BOOK_VERSION; // okay, resolves to // sdm::BOOK_VERSION... Handle h = getHandle(); // error! neither Handle // nor getHandle were... // imported into this scope } void f3() { cout << sdm::BOOK_VERSION;// okay, makes BOOK_VERSION // available for this one use... // only double d = BOOK_VERSION; // error! BOOK_VERSION is // not in scope Handle h = getHandle(); // error! neither Handle // nor getHandle were... // imported into this scope }

5 Użycie przestrzeni nazw W przypadku niejednoznaczności można jawnie użyć kwalifikatora zakresu :: namespace AcmeWindowSystem {... typedef int Handle;... } void f() { using namespace sdm; // import sdm symbols using namespace AcmeWindowSystem;// import Acme symbols... // freely refer to sdm // and Acme symbols // other than Handle Handle h; // error! which Handle? sdm::Handle h1; // fine, no ambiguity AcmeWindowSystem::Handle h2; // also no ambiguity... }

6 Anonimowe przestrzenie nazw Anonimowa przestrzeń nazw zastępuje użycie słowa kluczowego static przy nazwie globalnej Dostęp z zewnątrz do anonimowej przestrzeni nazw jest możliwy dzięki niejawnej dyrektywie użycia. Powyższa deklaracja jest równoważna następującej: $$$ jest pewną nazwą unikatową w zasięgu, w którym zdefiniowana jest ta przestrzeń nazw #include "header.h" namespace { int a; void f() {/*... */} int g() {/*... */ } } #include "header.h" namespace $$$ { int a; void f() {/*... */} int g() {/*... */ } } using namespace $$$;

7 Przeszukiwanie nazw Funkcja z argumentem typu T jest najczęściej zdefiniowana w tej samej przestrzeni nazw co T. Jeżeli więc nie można znaleźć funkcji w kontekście, w którym się jej używa, to szuka się jej w przestrzeniach nazw jej argumentów Reguła ta umożliwia pominięcie jawnego kwalifikowania nazw, co jest szczególnie istotne w przypadku argumentów funkcji operatorowych i wzorców, gdzie może to być szczególnie kłopotliwe. namespace Chrono { class Date { /*... */ }; bool operator==(const Date&, const std::string&) ; std::string format(const Date&) ; // make string representation //... } void f(Chrono::Date d, int i) { std::string s = format(d) ; // Chrono::format() std::string t = format(i) ; // error: no format() in scope }

8 Przeszukiwanie nazw W przypadku, kiedy funkcja przyjmuje argumenty z więcej niż jednej przestrzeni nazw, funkcje są wyszukiwane w przestrzeni nazw każdego argumentu i w zwykły sposób rozstrzyga się przeciążenie wszystkich znalezionych funkcji. Jeżeli funkcję wywołuje metoda klasy, to pierwszeństwo przed funkcjami znalezionymi przez typy argumentów mają metody tej samej klasy i jej klas bazowych. namespace Chrono { class Date { /*... */ }; bool operator==(const Date&, const std::string&); std::string format(const Date&) ; // make string representation //... } void f(Chrono::Date d, std::string s) { if (d == s) { //... } else if (d == "August 4, 1914") { //... }

9 Aliasy przestrzeni nazw Jeżeli użytkownicy nadają przestrzeniom nazw krótkie nazwy, to mogą one spowodować konflikt Długie nazwy są niewygodne w użyciu Dylemat ten można rozwiązać za pomocą krótkiego aliasu dla długiej nazwy przestrzeni nazw namespace A { // short name, will clash (eventually) //... } A::String s1 = "Grieg"; A::String s2 = "Nielsen"; namespace American_Telephone_and_Telegraph{ // too long //... } American_Telephone_and_Telegraph::String s3 = "Grieg"; American_Telephone_and_Telegraph::String s4 = "Nielsen"; // use namespace alias to shorten names: namespace ATT = American_Telephone_and_Telegraph; ATT::String s3 = "Grieg"; ATT::String s4 = "Nielsen";

10 Aliasy przestrzeni nazw Dzięki aliasom przestrzeni nazw użytkownik może także odwoływać się do biblioteki Upraszcza to wymianę jednej biblioteki na inną. Używanie Lib zamiast Foundation_library_v2r11 ułatwia przejście do wersji v3r5 - wystarczy zmienić inicjowanie aliasu Lib i ponownie skompilować kod. Nadużywanie aliasów może prowadzić do nieporozumień namespace Lib = Foundation_library_v2r11; //... Lib::set s; Lib::String s5 = "Sibelius";

11 Komponowanie przestrzeni nazw Często chcemy utworzyć interfejs z istniejących już interfejsów, np.: Teraz przy pisaniu programu można posługiwać się My_lib: namespace His_string { class String { /*... */ }; String operator+(const String&, const String&) ; String operator+(const String&, const char*) ; void fill(char) ; //... } namespace Her_vector { template class Vector { /*... */ }; //... } namespace My_lib { using namespace His_string; using namespace Her_vector; void my_fct(String&) ; } void f() { My_lib::String s = "Byron"; // finds My_lib::His_string::String //... } using namespace My_lib; void g(Vector & vs) { //... my_fct(vs[5]) ; //... }

12 Komponowanie przestrzeni nazw Definiując funkcję lub daną, musimy znać prawdziwą nazwę elementu: Idealna przestrzeń nazw powinna: wyrażać logicznie spójny zbiór cech nie dawać użytkownikom dostępu do innych cech nie stanowić znaczącego obciążenia notacyjnego dla użytkowników void My_lib::fill() // error: no fill() declared in My_lib { //... } void His_string::fill() // ok: fill() declared in His_string { //... } void My_lib::my_fct(My_lib::Vector & v) // ok { //... }

13 Wybór Czasami jest potrzebny dostęp jedynie do kilku nazw z danej przestrzeni. Można napisać deklarację przestrzeni nazw, zawierającą tylko te potrzebne nazwy Jeżeli nie jest się projektantem przestrzeni His_string, łatwo można wprowadzić bałagan. Zmiana w rzeczywistej definicji przestrzeni nie znajdzie odbicia w tej deklaracji. Wyboru elementów z przestrzeni nazw można dokonać jawnie za pomocą deklaracji użycia: Deklaracja użycia wprowadza do zasięgu każdą deklarację o danej nazwie. Pojedyncza deklaracja użycia może wprowadzić każdy wariant funkcji przeciążonej namespace His_string{ // part of His_string only class String { /*... */ }; String operator+(const String&, const String&) ; String operator+(const String&, const char*) ; } namespace My_string { using His_string::String; using His_string::operator+; // use any + from His_string }

14 Komponowanie i wybór Łączenie komponowania (za pomocą dyrektyw użycia) z wyborem (za pomocą deklaracji użycia) zapewnia elastyczność potrzebną w praktyce. Z użyciem tych mechanizmów możemy zapewnić dostęp do wielu udogodnień, a zarazem rozwiązać problem konfliktu nazw i niejednoznaczności wynikających z komponowania namespace His_lib { class String { /*... */ }; template class Vector { /*... */ }; //... } namespace Her_lib { template class Vector { /*... */ }; class String { /*... */ }; //... } namespace My_lib { using namespace His_lib; // everything from His_lib using namespace Her_lib; // everything from Her_lib using His_lib::String; // resolve potential clash in favor of His_lib using Her_lib::Vector; // resolve potential clash in favor of Her_lib template class List { /*... */ }; // additional stuff //... }

15 Komponowanie i wybór Nazwy zadeklarowane jawnie w przestrzeni nazw (łącznie z nazwami wprowadzonymi za pomocą deklaracji użycia) mają pierwszeństwo przed nazwami wprowadzonymi za pomocą dyrektyw użycia. Nazwę w nowej przestrzeni nazw można zmienić za pomocą dyrektywy typedef lub poprzez dziedziczenie namespace Lib2 { using namespace His_lib; // everything from His_lib using namespace Her_lib; // everything from Her_lib using His_lib::String; // resolve potential clash in favor of His_lib using Her_lib::Vector; // resolve potential clash in favor of Her_lib typedef Her_lib::String Her_string; // rename template class His_vec // "rename" : public His_lib::Vector { /*... */ }; template class List { /*... */ }; // additional stuff //... }

16 Przestrzenie nazw i przeciążanie Przeciążanie działa między przestrzeniami nazw. Dzięki temu przekształcenie istniejących bibliotek do postaci z użyciem przestrzeni nazw wymaga minimalnych zmian kodu źródłowego, np. // old A.h: void f(int) ; //... // old B.h: void f(char) ; //... // old user.c: #include "A.h" #include "B.h" void g() { f(´a´) ; // calls the f() from B.h } // new A.h: namespace A { void f(int) ; //... } // new B.h: namespace B { void f(char) ; //... } // new user.c: #include "A.h" #include "B.h" using namespace A; using namespace B; void g() { f(´a´) ; // calls the f()from B.h }

17 Przestrzenie nazw są otwarte Przestrzeń nazw jest otwarta, tzn. można do niej dodawać nazwy w kilku deklaracjach. W ten sposób można umieszczać duże fragmenty programów w pojedynczej przestrzeni nazw. Otwartość przestrzeni nazw jest pomocna w transformacji programów namespace A { int f() ; // now A has member f() } namespace A { int g() ; // now A has two members, f() and g() } // my header: void f() ; // my function //... #include int g() ; // my function //... // my header: namespace Mine { void f() ; // my function //... } #include namespace Mine { int g() ; // my function //... }

18 Przestrzenie nazw są otwarte Definiując wcześniej zadeklarowaną składową przestrzeni nazw, bezpieczeniej jest użyć składni Mine:: niż ponownie otwierać przestrzeń Mine Kompilator nie wykryje tego błędu przy próbie zdefiniowania ff() w ponownie otwartej przestrzeni nazw namespace Mine { void f(); } void Mine::ff() // error: no ff() declared in Mine { //... } namespace Mine { // reopening Mine to define functions void ff() // oops! no ff() declared in Mine; // ff() is added to Mine by this definition { //... } //... }

19 Przestrzenie nazw i C Deklaracje funkcji i danych zdefiniowanych w plikach kompilowanych kompilatorem C należy poprzedzić w C++ deklaratorem extern "C" W języku C++ zdefiniowano standardowe pliki nagłówkowe, w których funkcje są dostępne w przestrzeni nazw std // cstdio namespace std { //... extern "C" int printf(const char*... ) ; //... } extern "C" int printf(const char*... );extern "C" {... int printf(const char*... );... };

20 Wyjątki