Zaawansowane techniki programowania - 03. Szablony, Studia podyplomowe - mechatronika i coś tam jeszcze, ...
[ Pobierz całość w formacie PDF ] Wersja 2013-04 Wersja 2013-04 Zaawansowane techniki programowania Szablony Człowiek- najlepsza inwestycja Zaawansowane techniki programowania Szablony Funkcje uogólnione • Często spotyka się funkcje (algorytmy), które można zastosować do szerokiej klasy typów i struktur danych. Typowym przykładem jest funkcja obliczająca maksimum dwu wartości: int max(int a, int b) {return (a>b)?a:b;}; double max(double a,double b) {return (a>b)?a:b;}; string max(string a,string b) {return (a>b)?a:b;}; skorzystaliśmy tu z dostępnej w C++ możliwości przeładowywania funkcji int max(int a, int b) {return (a>b)?a:b;}; double max(double a,double b) {return (a>b)?a:b;}; string max(string a,string b) {return (a>b)?a:b;}; skorzystaliśmy tu z dostępnej w C++ możliwości przeładowywania funkcji main() { cout<< max(7,5)<<end; cout<< max(3.1415,2.71)<<endl; cout<< max("Ania","Basia")<<endl; } main() { cout<< max(7,5)<<end; cout<< max(3.1415,2.71)<<endl; cout<< max("Ania","Basia")<<endl; } Zaawansowane techniki programowania Funkcje uogólnione Makra i void ▫ W C++ mamy mechanizm nadpisywania nazw funkcji – jak widać działający. Ale ile trzeba się napisać ... ▫ Jeszcze w C był wykorzystywany mechanizm makrodefinicji: • #define max(a,b) ( (a>b)?a:b) ) • Podstawowa wada – brak możliwości debugowania takiego kodu i trudności z jego prawidłowym tworzeniem ▫ Inne rozwiązanie (też z C) - używanie wskaźników typów ogólnych, takich jak void *, • Przykład - qsort ze standardowej biblioteki C: void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)); void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)); • Ciągle nie jest to rozwiązanie wystarczająco elastyczne i bezpieczne, choć kiedyś było często wykorzystywane. Zaawansowane techniki programowania Funkcje uogólnione Dziedziczenie ▫ Można się również pokusić o próbę rozwiązania tego problemu za pomocą mechanizmów programowania obiektowego. • W sumie jest to bardziej wyrafinowana odmiana rzutowania na void *. • Polega na zdefiniowaniu ogólnego typu dla obiektów, które mogą być porównywane, kopiowane, itp...: class GreaterThanComparable { public: virtual bool operator>(const GreaterThanComparable &) const = 0; }; class GreaterThanComparable { public: virtual bool operator>(const GreaterThanComparable &) const = 0; }; const GreaterThanComparable & max(const GreaterThanComparable &a, const GreaterThanComparable &b) { return (a>b)? a:b; } const GreaterThanComparable & max(const GreaterThanComparable &a, const GreaterThanComparable &b) { return (a>b)? a:b; } class Int:public GreaterThanComparable { int val; public: Int(int i = 0):val(i) {}; operator int() {return val;}; virtual bool operator>(const GreaterThanComparable &b) const { return val > static_cast<const Int&>(b).val; } }; class Int:public GreaterThanComparable { int val; public: Int(int i = 0):val(i) {}; operator int() {return val;}; virtual bool operator>(const GreaterThanComparable &b) const { return val > static_cast<const Int&>(b).val; } }; main() { Int a(1),b(2),c; c = (const Int &)::max(a,b); cout<<(int)c<<endl; } main() { Int a(1),b(2),c; c = (const Int &)::max(a,b); cout<<(int)c<<endl; } Zaawansowane techniki programowania Funkcje uogólnione Dziedziczenie to podejście wymaga sporego nakładu pracy, a więc jest wysoce niepraktyczne. Ogólnie rzecz biorąc ma ono następujące wady: ▫ Wymaga dziedziczenia z abstrakcyjnej klasy bazowej GreaterThanComparable - może być zastosowane tylko do typów zdefiniowanych przez nas. Inne typy, w tym typy wbudowane, wymagają kopertowania w klasie opakowującej, takiej jak klasa Int w powyższym przykładzie. ▫ Ponieważ potrzebujemy polimorfizmu, funkcja operator>() musi być funkcją wirtualną, a więc musi być funkcją składową klasy i nie może być typu inline. W przypadku tak prostych funkcji niemożność rozwinięcia ich w miejscu wywołania może prowadzić do dużych narzutów w czasie wykonania. ▫ Funkcja max zwraca zawsze referencje do GreaterThanComparable, więc konieczne jest rzutowanie na typ wynikowy (tu Int).
[ Pobierz całość w formacie PDF ] zanotowane.pldoc.pisz.plpdf.pisz.plimikimi.opx.pl
|
|
StartZachowania Organizacyjne, Studia Zarządzanie PWR, Zarządzanie PWR I Stopień, III Semestr, Zachowania organizacyjneZagadnienie2- PrognozaWstep handout, Studia Zarządzanie PWR, Zarządzanie PWR II Stopień, II Semestr, Modelowanie ekonometryczne - prognozowanie, Wykład, 1 Wykładzabawy muzyczne0007, Studia, Praktyki, Zabawy muzycznezabawy muzyczne0020, Studia, Praktyki, Zabawy muzyczneZadania domowe - treści, Studia, PW - materiały, Informatyka, Informatyka II, Zadania domoweZarządzanie strategiczne - wykłady Piekarz, Zarządzanie i Inżynieria Produkcji - studia, Zarządzanie, Zarządzanie Strategicznezagadnienia na laborki z chemii, studia, semestr II, SEMESTR 2 PRZYDATNE (od Klaudii), Od Górskiego, II semestr, Chemia ogólna, Laboratoria, Chemia laborkiZadania do analizy, Studia, [xxx] Rok II, [xxx]Semestr 4, TMM [x], MiBM studenci, Zadanie analizy mechanizmuZagadnienie3Handout - Dekompozycja, Studia Zarządzanie PWR, Zarządzanie PWR II Stopień, II Semestr, Modelowanie ekonometryczne - prognozowanie, Wykład, 2 WykładZadania 5 bilans masowy b.ftalowy, Akademia Górniczo - Hutnicza, Technologia Chemiczna, Studia stacjonarne I stopnia, SEMESTR 6, ELEMNTY TECHNOLOGII CHEMICZNEJ, PROJEKT, Zadania
zanotowane.pldoc.pisz.plpdf.pisz.plagafilka.keep.pl
Cytat
Filozof sprawdza się w filozofii myśli, poeta w filozofii wzruszenia. Kostis Palamas Aby być szczęśliwym w miłości, trzeba być geniuszem. Honore de Balzac Fortuna kołem się toczy. Przysłowie polskie Forsan et haec olim meminisse iuvabit - być może kiedyś przyjemnie będzie wspominać i to wydarzenie. Wergiliusz Ex Deo - od Boga. |
|