Szablony wyrażeń i Boost Spirit

Wielkość: px
Rozpocząć pokaz od strony:

Download "Szablony wyrażeń i Boost Spirit"

Transkrypt

1 Szablony wyrażeń i Boost Spirit Romuald Juchnowicz-Bierbasz Warsaw C++ Users, 2015

2 Plan prezentacji Szablony wyrażeń Wprowadzenie Implementacja Właściwości i zastosowania Boost spirit Wprowadzenie Struktura biblioteki Teoria Podstawy Atrybuty parsera Akcje semantyczne Pozostałe funkcjonalności Zalety Źródła

3 Problem - Biblioteka do algebry liniowej Przykładowa implementacja klasy vector: 1 # include <vector > 2 3 class vector { 4 public : 5 vector ( size_t size ) : _data (size ) {} 6 double & operator []( size_t i) { return _data [i ];} 7 const double & operator []( size_t i) const { return _data [i ];} 8 size_t size (void ) const { return _data.size () ;} 9 private : 10 std :: vector < double > _data ; 11 }; Chcielibyśmy umożliwić zapis następujących wyrażeń: 1 vector v1 (3) ; 2 v1 [0] = 0; v1 [1] = 1; v1 [2] = 2; 3 vector v2 (3) ; 4 v2 [0] = 0; v2 [1] = 1; v2 [2] = 2; 5 vector v3 = v1 + v2 * 2;

4 Pierwsze podejście - przeciążenie operatorów +, *: 1 class vector { 2 public : 3 vector ( size_t size ) : _data (size ) {} 4 double & operator []( size_t i) { return _data [i ];} 5 double operator []( size_t i) const { return _data [i ];} 6 size_t size (void ) const { return _data.size () ;} 7 vector operator +( const vector & rhv ); 8 vector operator *( double rhv ); 9 private : 10 std :: vector < double > _data ; 11 }; // jesli chcemy pozwolic na wyrazenia 2 * v to rowniez : 14 vector operator *( double rhv, const vector & lhv );

5 Ile razy zostanie wywołany konstruktor w wyrażeniu: 1 vector v3 = v1 + v2 * 2;

6 Ile razy zostanie wywołany konstruktor w wyrażeniu: 1 vector v3 = v1 + v2 * 2; Przynajmniej 2 razy (przy założeniu RVO): tmp = v2 * 2 v3 = v1 + tmp

7 Ile razy zostanie wywołany konstruktor w wyrażeniu: 1 vector v3 = v1 + v2 * 2; Przynajmniej 2 razy (przy założeniu RVO): tmp = v2 * 2 v3 = v1 + tmp W przypadku bardziej złożonych wyrażeń odpowiednio więcej (5): 1 vector v = v1 + v2 * 2 + v3 * 3;

8 A wystarczyłoby jedno wywołanie: 1 vector v3 (3) ; 2 for ( size_t i = 0; i < v3.size (); ++i) 3 v3[i] = v1[i] + v2[i] * 2;

9 A wystarczyłoby jedno wywołanie: 1 vector v3 (3) ; 2 for ( size_t i = 0; i < v3.size (); ++i) 3 v3[i] = v1[i] + v2[i] * 2; Chcielibyśmy, aby poniższe wyrażenie generowało kod równoważny powyższemu: 1 vector v3 = v1 + v2 * 2

10 Pierwsza implementacja 1 template < typename E1, typename E2 > 2 class vector_addition { 3 public : 4 vector_addition ( const E1& u, const E2& v) 5 : _u(u), _v(v) 6 { 7 assert (u. size () == v. size ()); 8 } 9 double operator []( size_t i) const { 10 return _u[i] + _v[i]; 11 } 12 size_t size ( void ) const { return _u.size () ;} 13 private : 14 const E1& _u; 15 const E2& _v; 16 }; template < typename E> 19 class vector_scaled { 20 public : 21 vector_scaled ( const E& v, double scalar ) 22 : _v(v), _scalar ( scalar ) {} 23 double operator []( size_t i) const { 24 return _v[i] * _scalar ; 25 } 26 size_t size ( void ) const { return _v.size () ;} 27 private : 28 const E& _v; 29 double _scalar ; 30 };

11 Dodajmy odpowiedni konstruktror do klasy vector: 1 class vector { template < typename E> 4 vector (E const & exp ) { 5 _data. resize (exp.size ()); 6 for ( size_type i = 0; i!= exp.size (); ++i) { 7 _data [i] = exp [i]; 8 } 9 } };

12 Dodajmy jeszcze operatory, które jednocześnie będę pełniły rolę funkcji tworzących (Creator Functions - analogicznie do, np. std::make pair): 1 template < typename E1, typename E2 > 2 vector_addition <E1, E2 > operator +( const E1& u, const E2& v) 3 { 4 return vector_addition <E1, E2 >(u, v); 5 } 6 7 template < typename E> 8 vector_scaled <E> operator *( const E& v, double scalar ) 9 { 10 return vector_scaled <E >(v, scalar ); 11 } Możemy teraz zapisać: 1 v1 + v2 * 2;

13 Dodajmy jeszcze operatory, które jednocześnie będę pełniły rolę funkcji tworzących (Creator Functions - analogicznie do, np. std::make pair): 1 template < typename E1, typename E2 > 2 vector_addition <E1, E2 > operator +( const E1& u, const E2& v) 3 { 4 return vector_addition <E1, E2 >(u, v); 5 } 6 7 template < typename E> 8 vector_scaled <E> operator *( const E& v, double scalar ) 9 { 10 return vector_scaled <E >(v, scalar ); 11 } Możemy teraz zapisać: 1 v1 + v2 * 2; Jaki typ będzie miało to wyrażenie?

14 Do wykrywania typu użyjemy sztuczki zaprezentowanej przez Scotta Mayersa w Effective Modern C++ : 1 template <typename T> 2 class TD; // deklaracja bez definicji 3 4 TD < decltype (v1 + v2 * 2) > etype ; Błąd kompilatora: 1>c:\ users \ romek \ documents \ visual studio 2010\ projects \ spirit \ spirit \main.cpp (69) : error C2079 : etype uses undefined class TD<T> 1> with 1> [ 1> T=vector_addition <vector, vector_scaled <vector >> 1> ] 1>

15 Drzewo składniowe Nasz typ to: vector addition 1 vector_addition < 2 vector, 3 vector_scaled < 4 vector 5 > 6 > vector vector scaled vector double Czy widać tu podobieństwo do znanego wzorca projektowego?

16 Diagram klas Tak klasa nie jest zadekarowana vector policy +operator[](index: size_t): double +size(return_value: size_t) vector -_data: std::vector<double> +opertor[](index: size_t): double +size(return_value: size_t) vector_addition +size(return_value: size_t) +opertor[](index: size_t): double E1 E2

17 Diagram klas - wzorzec kompozyt Component +Operation() +Add(c: Component) +Remove(c: Component) +GetChild(index: int) Leaf +Operation() Composite +Operation() +Add(c: Component) +Remove(c: Component) +GetChild(index: int) +children

18 Diagram klas - wzorzec kompozyt Component +Operation() +Add(c: Component) +Remove(c: Component) +GetChild(index: int) Leaf +Operation() Composite +Operation() +Add(c: Component) +Remove(c: Component) +GetChild(index: int) +children Dlaczego więc po prostu nie stosować wzorca kompozyt?

19 Pytanie Are inline virtual member functions ever actually inlined? C++ Super-FAQ

20 Pytanie Are inline virtual member functions ever actually inlined? Odpowiedź Occasionally... C++ Super-FAQ When the object is referenced via a pointer or a reference, a call to a virtual function cannot be inlined, since the call must be resolved dynamically. Reason: the compiler can t know which actual code to call until run-time (i.e., dynamically), since the code may be from a derived class that was created after the caller was compiled. Therefore the only time an inline virtual call can be inlined is when the compiler knows the exact class of the object which is the target of the virtual function call. This can happen only when the compiler has an actual object rather than a pointer or reference to an object. I.e., either with a local object, a global/static object, or a fully contained object inside a composite.

21 Szablony wyrażeń pozwalają kompilatorowi na optymalizację kodu poprzez inline owanie metod klas składających się na wyrażenie. Możliwe jest więc aby polecenie: 1 vector v = v1 + v2 * 2; Wygenerowało kod analogiczny do: 1 vector v3 (3) ; 2 for ( size_t i = 0; i < v3.size (); ++i) 3 v3[i] = v1[i] + v2[i] * 2;

22 Problem - przeciążanie operatorów W naszym przykładzie przeciążyliśmy operatory +, *: 1 template < typename E1, typename E2 > 2 vector_addition <E1, E2 > operator +( const E1& u, const E2& v) 3 { 4 return vector_addition <E1, E2 >(u, v); 5 } 6 7 template < typename E> 8 vector_scaled <E> operator *( const E& v, double scalar ) 9 { 10 return vector_scaled <E >(v, scalar ); 11 } Czy taki kod może powodować problemy?

23 Przeciążyliśmy operatory dla dowolnych typów.

24 Przeciążyliśmy operatory dla dowolnych typów. Możemy sobie z tym poradzić dzięki: opakowaniu wszystkiego w przetrzeń nazw, zastosowaniu statycznego polimorfizmu - Curiously recurring template pattern - CRTP

25 Curiously recurring template pattern Przypomnijmy: 1 // CRTP 2 template <class T> 3 class Base 4 { 5 // metody klasy Base moga miec dostep do metod / atrybutow klasy Derived 6 }; 7 class Derived : public Base <Derived > 8 { 9 // };

26 Tworzymy szablonową klasę bazową: 1 template < typename E> 2 class expression { 3 public : 4 size_t size () const { return static_cast <E const & >(* this ).size () ;} 5 double operator []( size_t i) const { 6 return static_cast <E const & >(* this )[i]; 7 } 8 9 operator E &() { return static_cast <E& >(* this ); 10 operator const E &() const { return static_cast <const E& >(* this );} 11 };

27 Tworzymy szablonową klasę bazową: 1 template < typename E> 2 class expression { 3 public : 4 size_t size () const { return static_cast <E const & >(* this ).size () ;} 5 double operator []( size_t i) const { 6 return static_cast <E const & >(* this )[i]; 7 } 8 9 operator E &() { return static_cast <E& >(* this ); 10 operator const E &() const { return static_cast <const E& >(* this );} 11 }; Klasy vector, vector addition oraz vector scaled dziedziczą z expression: 1 class vector : public expression <vector > { 2 public : 3 vector ( size_t size ) : _data (size ) {} 4 template <typename E> vector ( expression <E> const & exp ); 5 double & operator []( size_t i) { return _data [i ];} 6 double operator []( size_t i) const { return _data [i ];} 7 size_t size (void ) const { return _data.size () ;} 8 private : 9 std :: vector <double > _data ; 10 };

28 1 template < typename E1, typename E2 > 2 class vector_addition : public expression < vector_addition <E1, E2 > > { 3 public : 4 vector_addition ( const E1& u, const E2& v) : _u(u), _v(v) { 5 assert (u. size () == v. size ()); 6 } 7 double operator []( size_t i) const { return _u[i] + _v[i ];} 8 size_t size (void ) const { return _u.size () ;} 9 private : 10 const E1& _u; 11 const E2& _v; 12 }; template < typename E> 15 class vector_scaled : public expression <vector_scaled <E> > { 16 public : 17 vector_scaled ( const E& v, double scalar ) : _v(v), _scalar ( scalar ) {} 18 double operator []( size_t i) const { return _v[i] * _scalar ;} 19 size_t size (void ) const { return _v.size () ;} 20 private : 21 const E& _v; 22 double _scalar ; 23 };

29 Teraz można operatory zapisać jako: 1 template < typename E1, typename E2 > 2 vector_addition <E1, E2 > operator +( 3 const expression <E1 >& u, const expression <E2 >& v 4 ) 5 { 6 return vector_addition <E1, E2 >(u, v); 7 } 8 9 template < typename E> 10 vector_scaled <E> operator *( const expression <E>& v, double scalar ) 11 { 12 return vector_scaled <E >(v, scalar ); 13 }

30 Diagram klas Uzyskany digram klas jeszcze bardziej przypomina wzorzec kompozyt: expression E +opertor[](index: size_t): double +size(return_value: size_t) vector -_data: std::vector<double> +opertor[](index: size_t): double +size(return_value: size_t) vector_addition +opertor[](index: size_t): double +size(return_value: size_t) E1 E2

31 Właściwości i zastosowania szablonów wyrażeń Właściwości: pozwalają wygenerować szybki kod wynikowy przy pomocy intuicyjnej składni, wydłużają kompilację.

32 Właściwości i zastosowania szablonów wyrażeń Właściwości: pozwalają wygenerować szybki kod wynikowy przy pomocy intuicyjnej składni, wydłużają kompilację. Zastosowania: do tworzenia wbudowanych języków dziedzinowych (domain-specific embedded language - DSEL), np.: nasza przykładowa biblioteka do algebry liniowej, Blitz++ - obliczenia naukowe, Boost Spirit - gramatyki EBNF, implementacja wartościowania leniwego (lazy evaluation), do łatwej generacji funktorów.

33 Przykładowe rozwiązanie pozwalające na generację funkcji jednoargumentowych: 1 struct variable { 2 double operator () ( double v) { return v;} 3 }; 4 5 struct constant { 6 double c; 7 constant ( double d) : c (d) {} 8 double operator () ( double ) { return c;} 9 }; template <class L, class H, class OP> 12 struct binary_expression { 13 L l_; 14 H h_; 15 binary_expression (L l, H h) : l_ (l), h_ (h) {} 16 double operator () ( double d) { return OP :: apply (l_ (d), h_(d));} 17 }; struct add { 20 static double apply ( double l, double h) { return l + h;} 21 }; template <class E> 24 struct expression { 25 E expr_ ; 26 expression (E e) : expr_ (e) {} 27 double operator () ( double d) { return expr_ (d);} 28 };

34 Dodajmy jeszcze operatory i definicje typów: 1 template <class A, class B> 2 expression <binary_expression <expression <A>, expression <B>, add > > 3 operator+( expression <A> a, expression <B> b) 4 { 5 typedef binary_expression <expression <A>, expression <B>, add > ExprT ; 6 return expression <ExprT >( ExprT (a,b)); 7 } 8 9 typedef expression <variable > var ; 10 typedef expression <constant > lit ; Możemy teraz napisać: 1 var x(( variable ())); // dlaczego nawiasy? 2 lit l( constant (5.0) ); 3 double result = (x + l + x) (2) ; // 9

35 Boost spirit Wprowadzenie Problem Parsowanie listy liczb całkowitych: 1, 2, 3, 5, 12,... std::vector<int> Jakie pomysły?

36 Boost spirit Wprowadzenie Problem Parsowanie listy liczb całkowitych: 1, 2, 3, 5, 12,... std::vector<int> Jakie pomysły? pętla ze scanf lub std::istream::operator>>? boost::regex? readline i boost::split?

37 Problem A co gdy wejście się trochę komplikuje? 1 + 3, 2 2, 44 33,... std::vector<int>

38 Problem A co gdy wejście się trochę komplikuje? 1 + 3, 2 2, 44 33,... std::vector<int> W przypadku prostego wejścia wcześniejsze pomysły wystarczają... Ale gdy złożoność rośnie należy użyć rozwiązania: ładniejszego, bardziej skalowalnego, bardziej odpornego na błędy, etc.

39 Znane narzędzia do generacji parserów: ANTLR Bison Yacc

40 Znane narzędzia do generacji parserów: ANTLR Bison Yacc Wady: kody pośrednie należy nauczyć się ich stosowania linkowanie bibliotek

41 Znane narzędzia do generacji parserów: ANTLR Bison Yacc Wady: kody pośrednie należy nauczyć się ich stosowania linkowanie bibliotek Może Boost.Spirit?

42 Struktura biblioteki Biblioteka Boost Spirit składa się z 3 części: lex - do tworzenia lekserów qi - do tworzenia parserów karma - do formatowania danych ( odwrotność qi) W ramach seminarium dokładniej omówiona zostanie część qi. Boost spirit zbudowany jest dzięki wykorzystaniu szablonów wyrażeń (przy użyciu Boost Proto). Aby w pełni wykorzystać potencjał biblioteki dobrze jest znać inne biblioteki Boost: Fusion, Phoenix.

43 Struktura biblioteki

44 qi i karma - ying i yang qi zamienia wejście na struktry danych: : string [1, 2, 3] : vector karma określa formatowanie struktur danych na wyjściu: [1, 2, 3] : vector : string

45 Przepływ danych qi - karma

46 Gramatyki Boost Spirit operuje na gramatykach bezkontekstowych przy użyciu rozszerzona notacja Backusa-Naura (Extended Backus Naur Form - EBNF): typ 0 - gramatyka kombinatoryczne, typ 1 - gramatyki kontekstowe, typ 2 - gramatyki bezkontekstowe, typ 3 - gramatyki regularne.

47 Rozszerzona notacja Backusa-Naura Notacja Backusa-Naura cyfra_bez_zera ::= "1" "2" "3" "4" "5" "6" "7" "8" "9" cyfra ::= "0" cyfra_bez_zera liczba_naturalna ::= cyfra_bez_zera, { cyfra } liczba_calkowita ::= "0" [ "-" ], liczba_naturalna Rozszerzona notacja Backusa-Naura cyfra_bez_zera ::= "1" "2" "3" "4" "5" "6" "7" "8" "9" cyfra ::= "0" cyfra_bez_zera liczba_naturalna ::= cyfra_bez_zera cyfra* liczba_calkowita ::= "0" "-"? liczba_naturalna

48 Qi - podstawy Boost Spirit Qi pozwala na zdefiniowanie parsera przy pomocy notacji EBNF w kodzie C++: cyfra_bez_zera ::= "1" "2" "3" "4" "5" "6" "7" "8" "9" cyfra ::= "0" cyfra_bez_zera liczba_naturalna ::= cyfra_bez_zera cyfra* liczba_całkowita ::= "0" "-"? liczba_naturalna 1 cyfra_bez_zera = char_ ( 1 ) char_ ( 2 ) char_ ( 3 ) 2 char_ ( 4 ) char_ ( 5 ) 3 char_ ( 6 ) char_ ( 7 ) 4 char_ ( 8 ) char_ ( 9 ); 5 cyfra = char_ ( 0 ) cyfra_bez_zera ; 6 liczba_naturalna = cyfra_bez_zera >> * cyfra ; 7 liczba_calkowita = char_ ( 0 ) -char_ ( - ) >> liczba_naturalna ;

49 Prosty parser - krok 1 Parser liczby całkowitej: int_

50 Prosty parser - krok 1 Parser liczby całkowitej: int_ Qi posiada wiele innych wbudowanych parserów: double char str

51 Prosty parser - krok 2 Parser 2 liczb całkowitych: int_ >> int_ Jest to kombinacja dwóch parserów tworząca nowy parser.

52 Prosty parser - krok 2 Parser 2 liczb całkowitych: int_ >> int_ Jest to kombinacja dwóch parserów tworząca nowy parser. Parser serii liczb całkowitych: *int_

53 Prosty parser - krok 2 Parser 2 liczb całkowitych: int_ >> int_ Jest to kombinacja dwóch parserów tworząca nowy parser. Parser serii liczb całkowitych: *int_ Parser serii liczb całkowitych oddzielonych przecinkiem: int_ >> *(char_(, ) >> int_)

54 Prosty parser - cały kod 1 bool parse_numbers ( const std :: string & s) 2 { 3 using qi :: int_ ; 4 using qi :: phrase_parse ; 5 using ascii :: space ; 6 7 std :: string :: iterator first = s. begin (); 8 std :: string :: iterator last = s.end (); 9 10 bool r = phrase_parse ( 11 first, 12 last, 13 int_ >> *(, >> int_ ), 14 space // parser bialych znakow 15 ); 16 if ( first!= last ) // nie udalo sie sparsowac calego wejscia 17 return false ; 18 return r; 19 }

55 Prosty parser - cały kod 1 bool parse_numbers ( const std :: string & s) 2 { 3 using qi :: int_ ; 4 using qi :: phrase_parse ; 5 using ascii :: space ; 6 7 std :: string :: iterator first = s. begin (); 8 std :: string :: iterator last = s.end (); 9 10 bool r = phrase_parse ( 11 first, 12 last, 13 int_ >> *(, >> int_ ), 14 space // parser bialych znakow 15 ); 16 if ( first!= last ) // nie udalo sie sparsowac calego wejscia 17 return false ; 18 return r; 19 } Pytanie Dlaczego w definicji parsera nie używaliśmy char?

56 Qi - atrybuty parsera Każdy parser udostępnia atrybut syntezowany - typ zwracany po poprawnym parsowaniu, który reprezentuję sparsowane wejście. Na przykład: int - int double - double char - char str - std::string

57 Atrybuty złożone A co ze złożeniem parserów? Przykłady: Wyrażenie Typy argumentów Typ rezultatu (a >> b) a: A, b: B tuple<a, B> (a b) a: A, b: B variant<a, B> (a b) a: A, b: A A *a a: A vector<a> -a: a: A optional<a>

58 Atrybuty złożone - przykłady Atrybutem syntezowanym int >> *(char (, ) >> int ) jest tuple< int, vector< tuple <char, int> > > Ale już wyrażenie: int >> *(lit(, ) >> int ) ma atrybyt syntezowany: vector<int>

59 Akcje semantyczne Poprzedni parser dawał nam odpowiedź jedynie na pytanie Czy wejście jest poprawnym wyrażeniem w zadanej gramatyce?. To dość mało... Chcemy więcej! Chcemy akcji semantycznych!

60 Akcje semantyczne Poprzedni parser dawał nam odpowiedź jedynie na pytanie Czy wejście jest poprawnym wyrażeniem w zadanej gramatyce?. To dość mało... Chcemy więcej! Chcemy akcji semantycznych! Niech: P - paser A - akcja Korzystając z operatora indeksu możemy przypisać akcję do parsera. P[A] Akcja A jest wywoływana po poprawnym sparsowaniu wejścia przez parser P.

61 Akcje semantyczne Akcję możemy zdefiniować używając: wskaźnika do funkcji obiektu funkcyjnego Boost.Bind i wskaźnika do funkcji Boost.Bind i wskaźnika do metody Boost.Lambda Boost.Phoenix

62 Akcje semantyczne - przykłady 1 namespace qi = boost :: spirit :: qi; 2 // funkcja 3 void print ( int const & i) { 4 std :: cout << i << std :: endl ; 5 } 6 7 // metoda 8 struct writer 9 { 10 void print ( int const & i) const { 11 std :: cout << i << std :: endl ; 12 } 13 }; // funktor 16 struct print_action 17 { 18 void operator ()(int const & i, qi :: unused_type, qi :: unused_type ) const { 19 std :: cout << i << std :: endl ; 20 } 21 };

63 Akcje semantyczne - przykłady Mamy zadane wejście: "{integer}" Chcemy wypisać liczbę znajdującą się w nawiasach: 1 // wskaznik do funkcji 2 parse ( first, last, { >> int_ [& print ] >> } ); 3 4 // funktor 5 parse ( first, last, { >> int_ [ print_action ()] >> } ); 6 7 // Boost. Bind ze wskaznikiem do funkcji 8 parse ( first, last, { >> int_ [ boost :: bind (& print, _1)] >> } ); 9 10 // Boost. Bind ze wskaznikiem do metody 11 writer w; 12 parse ( first, last, { >> int_ [ boost :: bind (& writer :: print, &w, _1)] >> } ); // Boost. Lambda 15 parse ( first, last, { >> int_ [ std :: cout << _1 << \n ] >> } );

64 Przykład - parser liczb zespolonych Parser liczb zespolonych: ( >> double_ >> -(, >> double_) >> ) double_ 1 template <typename Iterator > 2 bool parse_complex ( Iterator first, Iterator last, std :: complex <double >& c) 3 { 4 /* using boost ::... */ 5 6 double rn = 0.0; 7 double in = 0.0; 8 bool r = phrase_parse ( first, last, 9 // Begin grammar 10 ( 11 ( >> double_ [ref (rn) = _1] 12 >> -(, >> double_ [ ref (in) = _1 ]) >> ) 13 double_ [ref (rn) = _1] 14 ), 15 // End grammar 16 space ); if (!r first!= last ) // fail if we did not get a full match 19 return false ; 20 c = std :: complex <double >(rn, in); 21 return r; 22 }

65 Magia Boost Phoenix Zamiast ref z Boost Phoenix: double_[ref(rn) = _1] mogliśmy napisać: 1 struct set_double { 2 double & _d; 3 void operator ()( double const & d, qi :: unused_type, qi :: unused_type ) const 4 { 5 _d = d; 6 } 7 set_double ( double & d) : _d(d) {} 8 }; double_ [ set_double (nr)] 12...

66 Przykład - lista liczb zmiennoprzecinkowych Zamiast: double_ >> *(, >> double_) możemy napisać: double_ %, 1 template <typename Iterator > 2 bool parse_numbers ( Iterator first, Iterator last, std :: vector <double >& v) 3 { 4 /* using... */ 5 6 bool r = phrase_parse ( first, last, 7 8 // Begin grammar 9 ( 10 double_ [ push_back ( ref (v), _1)] %, 11 ) 12, 13 // End grammar space ); if ( first!= last ) // fail if we did not get a full match 18 return false ; 19 return r; 20 }

67 Przykład - lista liczb zmiennoprzecinkowych Możemy od razy otrzymać atrybut syntezowany z parsera: 1 template <typename Iterator > 2 bool parse_numbers ( Iterator first, Iterator last, std :: vector <double >& v) 3 { 4 using qi :: double_ ; 5 using qi :: phrase_parse ; 6 using qi :: _1; 7 using ascii :: space ; 8 9 bool r = phrase_parse ( first, last, // Begin grammar 12 ( 13 double_ %, 14 ) 15, 16 // End grammar space, v); if ( first!= last ) // fail if we did not get a full match 21 return false ; 22 return r; 23 }

68 Pozostałe funkcjonalności definiowanie reguł gramatycznych definiowanie gramatyk struktury jako atrybut syntezowany (Boost.Fusion) atrybuty dziedziczone obsługa błędów

69 Zalety Boost Spirit korzysta ze składni C++ wyłącznie pliki nagłówkowe bardzo szybka

70 Źródła I Expression templates More C++ Idioms/Expression-template Expression-template C++ Expression Templates ExpressionTemplates/ExpressionTemplates.htm Boost Spirit homepage C++ Super-FAQ

71 Źródła II E. Gamma, R. Helm, R. Johnson, J. Vlissides Design Patterns S. Meyers Effective Modern C++ A. Alexandrescu Modern C++ Design

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w C++ (PCP) Zaawansowane programowanie w C++ (PCP) Wykład 6 - szablony. dr inż. Robert Nowak - p. 1/15 Kolekcje i algorytmy» Deklaracja szablonu y Pojęcia niezależne od typu: kolekcje (np. listy) algorytmy (np. znajdowania

Bardziej szczegółowo

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi EGZAMIN PIERWSZY (25 CZERWCA 2013) JĘZYK C++ poprawiam ocenę pozytywną z egzaminu 0 (zakreśl poniżej x) 1. Wśród poniższych wskaż poprawną formę definicji

Bardziej szczegółowo

Curiously recurring template pattern

Curiously recurring template pattern class Derived : public Base Adam Mizerski adam@mizerski.pl Warsaw C++ Users Group 13 stycznia 2015 Wstęp The Matasano Crypto Challenges The Matasano Crypto Challenges http://cryptopals.com/ Wstęp

Bardziej szczegółowo

Szablony funkcji i szablony klas

Szablony funkcji i szablony klas Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2011 Bogdan Kreczmer Niniejszy dokument

Bardziej szczegółowo

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka

Bardziej szczegółowo

Język C++ wykład VIII

Język C++ wykład VIII Programowanie uzupełnienie notatek: dr Jerzy Białkowski 1 2 3 4 Obiektowość języka C++ ˆ Klasa (rozszerzenie struktury), obiekt instancją klasy, konstruktory i destruktory ˆ Enkapsulacja - kapsułkowanie,

Bardziej szczegółowo

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r. M. Trzebiński C++ 1/14 Podstawy języka C++ Maciej Trzebiński Instytut Fizyki Jądrowej Polskiej Akademii Nauk Praktyki studenckie na LHC IVedycja,2016r. IFJ PAN Przygotowanie środowiska pracy Niniejsza

Bardziej szczegółowo

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri); Przeciążanie operatorów [] Przykład: klasa reprezentująca typ tablicowy. Obiekt ma reprezentować tablicę, do której można się odwoływać intuicyjnie, np. Tab[i] Ma być też dostępnych kilka innych metod

Bardziej szczegółowo

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { Przeciążanie operatorów [] Przykład: klasa reprezentująca typ tablicowy. Obiekt ma reprezentować tablicę, do której można się odwoływać intuicyjnie, np. Tab[i] Ma być też dostępnych kilka innych metod

Bardziej szczegółowo

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki int getmax (int a, int b) { return (a > b? a : b); float getmax (float a, float b) { return (a > b? a : b); long getmax (long a, long b)

Bardziej szczegółowo

Signals + Threads: Qt vs. Boost

Signals + Threads: Qt vs. Boost Signals + Threads: Qt vs. Boost Adam Bujalski 2014-04-01 Adam Bujalski Signals + Threads: Qt vs. Boost 2014-04-01 1 / 22 Spis Treści 1 2 Wątki 3 Qt::QueuedConnection w boost Adam Bujalski Signals + Threads:

Bardziej szczegółowo

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej. Polimorfizm jest filarem programowania obiektowego, nie tylko jeżeli chodzi o język C++. Daje on programiście dużą elastyczność podczas pisania programu. Polimorfizm jest ściśle związany z metodami wirtualnymi.

Bardziej szczegółowo

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2 ( $%%) )'20 )*0) 1 / ) Jzyk C++ cz 3 Jarosław Gramacki Instytut Informatyki i Elektroniki # $$%%& ' ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )!" 2 # $$%%& ' ( $%%/,))3 ( %* 2 / 4 ( ( *' *''*,

Bardziej szczegółowo

Szablony. Szablony funkcji

Szablony. Szablony funkcji Szablony Szablony sa mechanizmem ponownego wykorzystania kodu (reuse) W przypadku funkcji ponownie wykorzystany jest algorytm W przypadku klas ponownie wykorzystane sa wszystkie skladowe Deklaracja szablonu

Bardziej szczegółowo

Wprowadzenie do szablonów szablony funkcji

Wprowadzenie do szablonów szablony funkcji Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Copyright c 2006 2010 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego.

Bardziej szczegółowo

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { Przeciążanie a dziedziczenie class Integer2: public Integer Operatory, z wyjątkiem operatora przypisania są automatycznie dziedziczone w klasach pochodnych. Integer2(int i): Integer(i) Automatyczne tworzenie

Bardziej szczegółowo

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016 Wykład 9 28 kwiecień 2016 Java Collections Framework (w C++ Standard Template Library) Kolekcja (kontener) Obiekt grupujacy/przechowuj acy jakieś elementy (obiekty lub wartości). Przykładami kolekcji sa

Bardziej szczegółowo

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Składnia C++ Programowanie Obiektowe Mateusz Cicheński Składnia C++ Programowanie Obiektowe Mateusz Cicheński Klasy i modyfikatory dostępu Przesłanianie metod Polimorfizm Wskaźniki Metody wirtualne Metody abstrakcyjne i interfejsy Konstruktory i destruktory

Bardziej szczegółowo

Wprowadzenie do szablonów szablony funkcji

Wprowadzenie do szablonów szablony funkcji Wprowadzenie do szablonów szablony funkcji Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Copyright c 2006 2010 Bogdan Kreczmer Niniejszy dokument zawiera materiały do

Bardziej szczegółowo

Wzorce funkcji (szablony)

Wzorce funkcji (szablony) Wzorce funkcji (szablony) Wzorce funkcji (ang. function template) dają możliwość wielokrotnego wykorzystywania tego samego kodu funkcji dla różnych typów danych. Załóżmy, że chcemy zdefiniować funkcję

Bardziej szczegółowo

Identyfikacje typu na etapie. wykonania (RTTI)

Identyfikacje typu na etapie. wykonania (RTTI) Identyfikacje typu na etapie (Run Time Type Identification) wykonania (RTTI) Może powstać taka sytuacje, gdy w trakcie kompilacji typ obiektu nie jest znany. C++ implementuje polimorfizm poprzez hierarchie

Bardziej szczegółowo

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 2. Poprawna definicja wskażnika b to: a) float *a, **b = &a; b) float

Bardziej szczegółowo

C++ Przeładowanie operatorów i wzorce w klasach

C++ Przeładowanie operatorów i wzorce w klasach C++ i wzorce w klasach Andrzej Przybyszewski numer albumu: 89810 14 listopada 2009 Ogólnie Przeładowanie (przeciążanie) operatorów polega na nadaniu im nowych funkcji. Przeładowanie operatora dokonuje

Bardziej szczegółowo

Programowanie i struktury danych

Programowanie i struktury danych Programowanie i struktury danych 1 / 30 STL Standard Template Library, STL (ang. = Standardowa Biblioteka Wzorców) biblioteka C++ zawierająca szablony (wzorce), które umożliwiają wielokrotne użycie. Główne

Bardziej szczegółowo

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej Wykład I - semestr II Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2015 c Copyright 2015 Janusz Słupik Zaliczenie przedmiotu Do zaliczenia przedmiotu niezbędne jest

Bardziej szczegółowo

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw Mirosław Głowacki 1 1 Akademia Górniczo-Hutnicza im. Stanisława Staszica w Ktrakowie Wydział Inżynierii Metali i Informatyki Stosowanej

Bardziej szczegółowo

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.: Program przedmiotu Programowanie Obiektowe (język C++) Wykład 1. Definiowanie prostych klas. Przykłady. Przypomnienie: typy referencyjne, domyślne wartości argumentów, przeciąŝanie funkcji. Konstruktory,

Bardziej szczegółowo

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w C++ (PCP) Wykład 9 - powtórzenie. 11 maja 2007 Powtórzenie materiału obiekty automatyczne, statyczne, tymczasowe, dynamiczne dziedziczenie, agregacja polimorfizm, funkcje wirtualne wzorce projektowe (strukturalne,

Bardziej szczegółowo

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton Dzisiejszy wykład Wzorce projektowe Visitor Client-Server Factory Singleton 1 Wzorzec projektowy Wzorzec nazwana generalizacja opisująca elementy i relacje rozwiązania powszechnie występującego problemu

Bardziej szczegółowo

obiekty funkcyjne - funktory

obiekty funkcyjne - funktory #include #include #include #include #include #include #include #include #include #include using namespace

Bardziej szczegółowo

Programowanie w języku C++

Programowanie w języku C++ Programowanie w języku C++ Część dziewiąta Autor Roman Simiński Kontakt siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi

Bardziej szczegółowo

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? 1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? a) konstruktor b) referencje c) destruktor d) typy 2. Które z poniższych wyrażeń są poprawne dla klasy o nazwie

Bardziej szczegółowo

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++ IMIĘ i NAZWISKO: przykładowe odpowiedzi NR: 0 EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++ 1. Napisz precyzyjnie co to jest ptr jeśli: const * const Foo ptr; ptr to stały wskaźnik do stałego obiektu typu Foo

Bardziej szczegółowo

Operatory na rzecz typu TString

Operatory na rzecz typu TString Operatory na rzecz typu TString Dopiszmy w definicji klasy operator[], dzięki któremu potraktujemy obiekt jak tablicę class TString { public: char& operator[]( size_t n ); const char& operator[]( size_t

Bardziej szczegółowo

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017 Wykład 13 14 czerwiec 2017 Java vs cpp - podobieństwa Podobny sposób definiowania klas. Występowanie typów podstawowych: boolean, char, byte, short, int, long, float, double. Podobna zasada definiowania

Bardziej szczegółowo

Obsługa wyjątków. Język C++ WW12

Obsługa wyjątków. Język C++ WW12 Obsługa wyjątków Pozwala zarządzać błędami wykonania w uporządkowany sposób. Umożliwia automatyczne wywołanie części kodu, funkcji, metod klas, który trzeba wykonać przy powstaniu błędów. try //blok try

Bardziej szczegółowo

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.: Program przedmiotu Programowanie (język C++) Wykład 1. Język C a C++. Definiowanie prostych klas. Typy referencyjne. Domyślne wartości argumentów. PrzeciąŜanie funkcji. Konstruktory, destruktory. Definiowanie

Bardziej szczegółowo

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16 M. Trzebiński C++ 1/16 Podstawy języka C++ Maciej Trzebiński Instytut Fizyki Jądrowej Polskiej Akademii Nauk Praktyki studenckie na LHC IFJ PAN 6lipca2015 Uruchomienie maszyny w CC1 M. Trzebiński C++ 2/16

Bardziej szczegółowo

Szablony funkcji i klas (templates)

Szablony funkcji i klas (templates) Instrukcja laboratoryjna nr 3 Programowanie w języku C 2 (C++ poziom zaawansowany) Szablony funkcji i klas (templates) dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż. Tomasz Kaczmarek Wstęp

Bardziej szczegółowo

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w C++ (PCP) Zaawansowane programowanie w C++ (PCP) Wykład 4 - wzorce projektowe. dr inż. Robert Nowak - p. 1/18 Powtórzenie klasy autonomiczne tworzenie nowych typów: dziedziczenie i agregacja dziedziczenie: przedefiniowywanie

Bardziej szczegółowo

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this Wstęp do programowania obiektowego WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this 1 Nazwa typu Rozmiar Zakres Uwagi bool 1 bit wartości true albo false stdbool.h TYPY ZNAKOWE

Bardziej szczegółowo

C++11. C++ 11 wybrane elementy. C++11: referencje do rvalue C++ 11: C++11: referencje do rvalue. C++11: referencje do rvalue. Referencje do rvalue

C++11. C++ 11 wybrane elementy. C++11: referencje do rvalue C++ 11: C++11: referencje do rvalue. C++11: referencje do rvalue. Referencje do rvalue C++ 11 wybrane elementy C++11 Lista rozszerzeń C++11 obecnych w VC2013: 1. Referencje do rvalue, 2. Jednolite inicjowanie i delegowanie konstruktorów, 3. Konstruktory delegujące 4. Jednolita inicjalizacja

Bardziej szczegółowo

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje Zbudujemy klasę Definicję klasy zapiszmy w pliku tstring.h #ifndef TSTRING_H #define TSTRING_H #include // w pliku nagłówkowym NIE // otwieramy przestrzeni std // interfejs private: // implementacja

Bardziej szczegółowo

PARADYGMATY PROGRAMOWANIA Wykład 4

PARADYGMATY PROGRAMOWANIA Wykład 4 PARADYGMATY PROGRAMOWANIA Wykład 4 Metody wirtualne i polimorfizm Metoda wirualna - metoda używana w identyczny sposób w całej hierarchii klas. Wybór funkcji, którą należy wykonać po wywołaniu metody wirtualnej

Bardziej szczegółowo

C++ język nie dla ludzi o słabych nerwach. Małgorzata Bieńkowska

C++ język nie dla ludzi o słabych nerwach. Małgorzata Bieńkowska C++ język nie dla ludzi o słabych nerwach Małgorzata Bieńkowska malgorzata.bienkowska@gmail.com 9LivesData HYDRAStor Dla NEC Japan od ponad 10 lat 1,5 miliona linii kodu większość rozwijana w Warszawie

Bardziej szczegółowo

Kurs programowania. Wykład 9. Wojciech Macyna

Kurs programowania. Wykład 9. Wojciech Macyna Wykład 9 Java Collections Framework (w C++ Standard Template Library) Kolekcja (kontener) Obiekt grupujacy/przechowuj acy jakieś elementy (obiekty lub wartości). Przykładami kolekcji sa zbiór, lista czy

Bardziej szczegółowo

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis. Programowanie uzupełnienie notatek: dr Jerzy Białkowski 1 2 3 4 Obiektowość języka C++ ˆ Klasa (rozszerzenie struktury), obiekt instancją klasy, konstruktory i destruktory ˆ Enkapsulacja - kapsułkowanie,

Bardziej szczegółowo

Abstrakcyjny typ danych

Abstrakcyjny typ danych Abstrakcyjny typ danych Abstrakcyjny Typ Danych (abstract data type-adt): zbiór wartości wraz z powiązanymi z nimi operacjami; operacje są zdefiniowane w sposób niezależny od implementacji; operacje są

Bardziej szczegółowo

Technologie programowania Wykład 4. Szablony funkcji Notes. Szablony funkcji Notes. Szablony funkcji Notes. Notes. Przemek Błaśkiewicz.

Technologie programowania Wykład 4. Szablony funkcji Notes. Szablony funkcji Notes. Szablony funkcji Notes. Notes. Przemek Błaśkiewicz. Technologie programowania Wykład 4 Przemek Błaśkiewicz 9 maja 2017 1 / 54 Szablony funkcji Często w programach zachodzi potrzeba użycia funkcji, które co do mechanizmu działaja tak samo, ale różnia się

Bardziej szczegółowo

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Składnia C++ Programowanie Obiektowe Mateusz Cicheński Składnia C++ Programowanie Obiektowe Mateusz Cicheński Klasy i modyfikatory dostępu Przesłanianie metod Polimorfizm Wskaźniki Metody wirtualne Metody abstrakcyjne i interfejsy Przeciążanie operatorów Słowo

Bardziej szczegółowo

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006) Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006) Część 1. Teoria Wyjaśnij pojęcia, podaj przykład: klasa obiekt konstruktor destruktor kapsułkowanie (hermetyzacja) wskaźnik this

Bardziej szczegółowo

Wprowadzenie do szablonów klas

Wprowadzenie do szablonów klas Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2008-2010 Bogdan Kreczmer Niniejszy

Bardziej szczegółowo

Programowanie obiektowe w C++ Wykład 12

Programowanie obiektowe w C++ Wykład 12 Programowanie obiektowe w C++ Wykład 12 dr Lidia Stępień Akademia im. Jana Długosza w Częstochowie L. Stępień (AJD) 1 / 22 Zakresowe pętle for double tab[5] {1.12,2.23,3.33,4.12,5.22 for(double x: tab)

Bardziej szczegółowo

Wstęp do Programowania 2

Wstęp do Programowania 2 Wstęp do Programowania 2 dr Bożena Woźna-Szcześniak bwozna@gmail.com Akademia im. Jana Długosza Wykład 4 Funkcje przeciażone - Idea Przeciażanie funkcji (polimorfizm funkcji), to kolejna nowość w języku

Bardziej szczegółowo

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana Wykład Materiały bazują częściowo na slajdach Marata Dukhana Języki programowania Kompilowane np. C, C++, Pascal Interpretowane np. JavaScript, PHP, Python, VBA Pośrednie np. Java, C# Znane kompilatory

Bardziej szczegółowo

Programowanie - wykład 4

Programowanie - wykład 4 Programowanie - wykład 4 Filip Sośnicki Wydział Fizyki Uniwersytet Warszawski 20.03.2019 Przypomnienie Prosty program liczący i wyświeltający wartość silni dla wprowadzonej z klawiatury liczby: 1 # include

Bardziej szczegółowo

Paradygmaty programowania

Paradygmaty programowania Paradygmaty programowania Programowanie generyczne w C++ Dr inż. Andrzej Grosser Cz estochowa, 2016 2 Spis treści 1. Zadanie 3 5 1.1. Wprowadzenie.................................. 5 1.2. Obiekty funkcyjne................................

Bardziej szczegółowo

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019 Wykład 3 22 marca 2019 Klasy wewnętrzne Klasa wewnętrzna class A {... class B {... }... } Klasa B jest klasa wewnętrzna w klasie A. Klasa A jest klasa otaczajac a klasy B. Klasy wewnętrzne Właściwości

Bardziej szczegółowo

Programowanie Komputerów

Programowanie Komputerów Programowanie Komputerów Łukasz Kuszner pokój 209, WETI http://www.kaims.pl/ kuszner/ kuszner@eti.pg.gda.pl Wykład 30 godzin, Laboratoria 30 godzin 2012/ Strona 1 z 28 1. Tablice w C# Indeksowane od zera

Bardziej szczegółowo

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016 Wykład 1 3 marca 2016 Słowa kluczowe języka Java abstract, break, case, catch, class, const, continue, default, do, else, enum, extends, final, finally, for, goto, if, implements, import, instanceof, interface,

Bardziej szczegółowo

Programowanie 2. Język C++. Wykład 3.

Programowanie 2. Język C++. Wykład 3. 3.1 Programowanie zorientowane obiektowo... 1 3.2 Unie... 2 3.3 Struktury... 3 3.4 Klasy... 4 3.5 Elementy klasy... 5 3.6 Dostęp do elementów klasy... 7 3.7 Wskaźnik this... 10 3.1 Programowanie zorientowane

Bardziej szczegółowo

C++11. C++ 11 wybrane elementy. C++11: referencje do rvalue C++ 11: C++11: referencje do rvalue. C++11: referencje do rvalue. Referencje do rvalue

C++11. C++ 11 wybrane elementy. C++11: referencje do rvalue C++ 11: C++11: referencje do rvalue. C++11: referencje do rvalue. Referencje do rvalue C++ 11 wybrane elementy C++11 Lista rozszerzeń C++11 obecnych w VC2013: 1. Referencje do rvalue, 2. Jednolite inicjowanie i delegowanie konstruktorów, 3. Konstruktory delegujące 4. Jednolita inicjalizacja

Bardziej szczegółowo

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów Operatory są elementami języka C++. Istnieje zasada, że z elementami języka, takimi jak np. słowa kluczowe, nie można dokonywać żadnych zmian, przeciążeń, itp. PRZECIĄŻANIE OPERATORÓW Ale dla operatorów

Bardziej szczegółowo

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27 Programowanie w C++ Wykład 12 Katarzyna Grzelak 28 maja 2018 K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27 Klasy cd K.Grzelak (Wykład 12) Programowanie w C++ 2 / 27 Klasy - powtórzenie Klasy typy definiowane

Bardziej szczegółowo

Technologie cyfrowe semestr letni 2018/2019

Technologie cyfrowe semestr letni 2018/2019 Technologie cyfrowe semestr letni 2018/2019 Tomasz Kazimierczuk Wykład 8 (15.04.2019) Kompilacja Kompilacja programu (kodu): proces tłumaczenia kodu napisanego w wybranym języku na kod maszynowy, zrozumiały

Bardziej szczegółowo

Wykład I. Programowanie III - semestr III Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Wykład I. Programowanie III - semestr III Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej Wykład I - semestr III Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2014 c Copyright 2014 Janusz Słupik Zaliczenie przedmiotu Do zaliczenia przedmiotu niezbędne jest

Bardziej szczegółowo

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego. Funkcje wirtualne W C++ polimorfizm jest zrealizowany w dwa sposoby: na etapie kompilacji i na etapie wykonania. Na etapie kompilacji polimorfizm jest zrealizowany poprzez przeciążenie funkcji i operatorów.

Bardziej szczegółowo

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w C++ (PCP) Zaawansowane programowanie w C++ (PCP) Wykład 1 - sprawy organizacyjne i wprowadzenie. dr inż. Robert Nowak - p. 1/27 Cel i zakres przedmiotu Umiejętność programowania to umiejętność rozwiazania problemów

Bardziej szczegółowo

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016 Wykład 2 17 marca 2016 Dziedziczenie Klasy bazowe i potomne Dziedziczenie jest łatwym sposobem rozwijania oprogramowania. Majac klasę bazowa możemy ja uszczegółowić (dodać nowe pola i metody) nie przepisujac

Bardziej szczegółowo

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp Programowanie uzupełnienie notatek: dr Jerzy Białkowski 1 2 3 4 Historia C++ został zaprojektowany w 1979 przez Bjarne Stroustrupa jako rozszerzenie języka C o obiektowe mechanizmy abstrakcji danych i

Bardziej szczegółowo

Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ Narzędzia, zastosowanie oraz próby rankingu.

Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ Narzędzia, zastosowanie oraz próby rankingu. Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ Narzędzia, zastosowanie oraz próby rankingu. Flex Flex wywodzi się jak cała rodzina tego typu narzędzi od jednego przodka:

Bardziej szczegółowo

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Zaawansowane programowanie w języku C++ Programowanie obiektowe Zaawansowane programowanie w języku C++ Programowanie obiektowe Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka

Bardziej szczegółowo

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi 1. Napisz wskaźnik do funkcji fun tak zdeklarowanej: T* fun( int, double const& ) const; definicja wskaźnika musi być precyzyjna, inaczej

Bardziej szczegółowo

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30 Programowanie w C++ Wykład 11 Katarzyna Grzelak 13 maja 2019 K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30 Klasy cd K.Grzelak (Wykład 11) Programowanie w C++ 2 / 30 Klasy - powtórzenie Klasy typy definiowane

Bardziej szczegółowo

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class). Wprowadzenie w dziedziczenie Klasa D dziedziczy klasę B: B klasa bazowa D klasa pochodna Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class). Najpierw jest tworzona klasa bazowa,

Bardziej szczegółowo

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski. - - uzupełnienie notatek: dr Jerzy Białkowski - - 1-2 - - - 1 #include 2 #include 3 # include 4 using namespace std ; 5 6 class Punkt { 7 8 private : 9 double

Bardziej szczegółowo

Metody Kompilacji Wykład 3

Metody Kompilacji Wykład 3 Metody Kompilacji Wykład 3 odbywa się poprzez dołączenie zasad(reguł) lub fragmentów kodu do produkcji w gramatyce. Włodzimierz Bielecki WI ZUT 2 Na przykład, dla produkcji expr -> expr 1 + term możemy

Bardziej szczegółowo

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji Politechnika Białostocka Wydział Elektryczny Katedra Telekomunikacji i Aparatury Elektronicznej Instrukcja do pracowni specjalistycznej z przedmiotu Obiektowe programowanie aplikacji Kod przedmiotu: TS1C410201

Bardziej szczegółowo

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40 Programowanie w C++ Wykład 6 Katarzyna Grzelak kwiecień 2019 K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40 STL - powtórzenie STL Standard Template Libarary standardowa biblioteka szablonów Składowe biblioteki:

Bardziej szczegółowo

Instrukcja laboratoryjna cz.3

Instrukcja laboratoryjna cz.3 Języki programowania na platformie.net cz.2 2015/16 Instrukcja laboratoryjna cz.3 Język C++/CLI Prowadzący: Tomasz Goluch Wersja: 2.0 I. Utworzenie projektu C++/CLI z interfejsem graficznym WPF 1 Cel:

Bardziej szczegółowo

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych. Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych. 1. Przygotowanie środowiska programistycznego. Zajęcia będą

Bardziej szczegółowo

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Zaawansowane programowanie w języku C++ Biblioteka standardowa Zaawansowane programowanie w języku C++ Biblioteka standardowa Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka

Bardziej szczegółowo

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31 Programowanie w C++ Wykład 8 Katarzyna Grzelak 7 maja 2018 K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31 STL - powtórzenie STL Standard Template Libarary standardowa biblioteka szablonów Składowe biblioteki:

Bardziej szczegółowo

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27 Programowanie w C++ Wykład 14 Katarzyna Grzelak 3 czerwca 2019 K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27 Na ostatnim wykładzie: Konstruktor standardowy (domyślny) to taki, który nie ma żadnych argumentów

Bardziej szczegółowo

Modelowanie numeryczne w fizyce atmosfery Ćwiczenia 3

Modelowanie numeryczne w fizyce atmosfery Ćwiczenia 3 Modelowanie numeryczne w fizyce atmosfery Sylwester Arabas (ćwiczenia do wykładu dr. hab. inż. Lecha Łobockiego) Instytut Geofizyki, Wydział Fizyki Uniwersytetu Warszawskiego 3. listopada 2011 r. Schemat

Bardziej szczegółowo

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne Tematyka wykładów 1. Wprowadzenie. Klasy cz. 1 - Język C++. Programowanie obiektowe - Klasy i obiekty - Budowa i deklaracja klasy. Prawa dostępu - Pola i funkcje składowe - Konstruktor i destruktor - Tworzenie

Bardziej szczegółowo

Programowanie w C++ - wybrane przykłady szablonów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ

Programowanie w C++ - wybrane przykłady szablonów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ programowanie w C++ dla OWK Programowanie w C++ - wybrane przykłady szablonów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ 1 Streszczenie W tym rozdziale podamy kilka najprostszych przykładów programów

Bardziej szczegółowo

Paradygmaty programowania. Paradygmaty programowania

Paradygmaty programowania. Paradygmaty programowania Paradygmaty programowania Paradygmaty programowania Dr inż. Andrzej Grosser Cz estochowa, 2013 2 Spis treści 1. Zadanie 2 5 1.1. Wprowadzenie.................................. 5 1.2. Wskazówki do zadania..............................

Bardziej szczegółowo

Wstęp do programowania

Wstęp do programowania wykład 10 Agata Półrola Wydział Matematyki i Informatyki UŁ semestr zimowy 2018/2019 Przesyłanie argumentów - cd Przesyłanie argumentów do funkcji - tablice wielowymiarowe Przekazywanie tablic wielowymiarowych

Bardziej szczegółowo

Wydajność użycia funktorów z biblioteką STL języka C++

Wydajność użycia funktorów z biblioteką STL języka C++ Wydajność użycia funktorów z biblioteką STL języka C++ Irek Szcześniak, Maciek Sobczak 1 października 2005 roku Streszczenie Artykuł dotyczy wydajności użycia funktorów z biblioteką STL (Standard Template

Bardziej szczegółowo

Programowanie obiektowe i C++ dla matematyków

Programowanie obiektowe i C++ dla matematyków Programowanie obiektowe i C++ dla matematyków Bartosz Szreder szreder (at) mimuw... 10 I 2012 1 Zabronienie kopiowania Czasami nie ma sensu, żeby obiekty pewnego typu były kopiowane z innych obiektów.

Bardziej szczegółowo

Projektowanie klas c.d. Projektowanie klas przykład

Projektowanie klas c.d. Projektowanie klas przykład Projektowanie klas c.d. ogólne wskazówki dotyczące projektowania klas: o wyodrębnienie klasy odpowiedź na potrzeby życia (obsługa rozwiązania konkretnego problemu) o zwykle nie uda się utworzyć idealnej

Bardziej szczegółowo

Szablony klas, zastosowanie szablonów w programach

Szablony klas, zastosowanie szablonów w programach Szablony klas, zastosowanie szablonów w programach 1. Szablony klas i funkcji 2. Szablon klasy obsługującej uniwersalną tablicę wskaźników 3. Zastosowanie metody zwracającej przez return referencję do

Bardziej szczegółowo

#include <iostream> using namespace std; void ela(int); int main( ); { Funkcja 3. return 0; }

#include <iostream> using namespace std; void ela(int); int main( ); { Funkcja 3. return 0; } #include using namespace std; Prototypy funkcji Funkcja 1 void ela(int); double info (double); int main( ); return 0; Funkcja 2 void ela(int); Funkcja 3 double info(double); return 4*t; jeszcze

Bardziej szczegółowo

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy : Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy : class nazwa_klasy prywatne dane i funkcje public: publiczne dane i funkcje lista_obiektów;

Bardziej szczegółowo

Technologie cyfrowe semestr letni 2018/2019

Technologie cyfrowe semestr letni 2018/2019 Technologie cyfrowe semestr letni 2018/2019 Tomasz Kazimierczuk Wykład 7 (08.04.2019) Wikipedia Programowanie komputerów proces projektowania, tworzenia, testowania i utrzymywania kodu źródłowego programów

Bardziej szczegółowo

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej Zajęcia nr 2 Programowanie strukturalne dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej Pętla while #include using namespace std; int main ()

Bardziej szczegółowo

STL: implementowanie algorytmów C++: STL. STL: implementowanie algorytmów. STL: implementowanie algorytmów. STL: implementowanie algorytmów

STL: implementowanie algorytmów C++: STL. STL: implementowanie algorytmów. STL: implementowanie algorytmów. STL: implementowanie algorytmów Algorytm przeszukiwania w głąb Przeszukiwanie grafu odwiedzenie wszystkich jego wierzchołków w kolejności jak na rysunku obok: C++: STL Implementowanie własnych algorytmów Reprezentacja grafu w programie

Bardziej szczegółowo

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50. Programowanie (język C++) referencje Wykład 2. Referencje (1) Referencja (odnośnik) jest zmienną identyfikującą inną zmienną. Wykonanie operacji na referencji ma taki sam skutek, jak wykonanie tejŝe operacji

Bardziej szczegółowo