Zaawansowane techniki ...
pdf > do ÂściÂągnięcia > download > ebook > pobieranie
 
Cytat
Ab igne ignem - z ognia ogień. (Cycero). (Cycero)
Start Zaćmienie, Zajecia 2, zaaowanane,
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • imikimi.opx.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • agafilka.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.

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com