Wskaźniki do funkcji i metod

Podobne dokumenty
Programowanie 2. Język C++. Wykład 9.

Wykład 8: klasy cz. 4

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

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie obiektowe

Szablony klas, zastosowanie szablonów w programach

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Materiały do zajęć VII

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

Programowanie 2. Język C++. Wykład Relacje między klasami, klasy zagnieŝdŝone, klasy lokalne

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

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Zaawansowane programowanie w języku C++ Klasy w C++

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

Zaawansowane programowanie w C++ (PCP)

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

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

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

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

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

Wykład 5: Klasy cz. 3

Wprowadzenie do szablonów klas

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.

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

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

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

Programowanie obiektowe

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Dziedziczenie jednobazowe, poliformizm

PODEJŚCIE OBIEKTOWE. Przykład 1 metody i atrybuty statyczne

Klasy cd. Struktury Interfejsy Wyjątki

int suma; pralka czerwona; // definicja egzemplarza obiektu pralka * wskaŝ; // definicja wskaźnika pralka & ruda = czerwona; // definicja referencji

Programowanie komputerowe. Zajęcia 7

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

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

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

Rozdział 3. Zapisywanie stanu aplikacji w ustawieniach lokalnych

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

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Do czego służą klasy?

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Referencje do zmiennych i obiektów


Wykład 5: Więcej o Klasach i Metodach

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

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

TEMAT : KLASY DZIEDZICZENIE

Wykład 4: Klasy i Metody

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

Struktury - wprowadzenie

Dokumentacja do API Javy.

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Język C++ zajęcia nr 2

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Enkapsulacja, dziedziczenie, polimorfizm

Zaawansowane programowanie w C++ (PCP)

Klasy abstrakcyjne, interfejsy i polimorfizm

Co to jest klasa? Z programistycznego punktu widzenia klasa stanowi typ danych, który odwzorowuje wspólne cechy jakiegoś obiektu.

Przekazywanie argumentów wskaźniki

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

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.

Definiowanie własnych klas

Pola i metody statyczne

using System;... using System.Threading;

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Programowanie obiektowe

Polimorfizm. dr Jarosław Skaruz

Programowanie obiektowe Wykład 1. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20

Programowanie obiektowe w języku

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

Do czego służą klasy?

Kompozycja i dziedziczenie klas

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Programowanie obiektowe

Programowanie obiektowe

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

Programowanie obiektowe. Wykład 5. C++: szablony

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

Wprowadzenie do programowanie obiektowego w języku C++

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Wykład 7: Pakiety i Interfejsy

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

Lab 9 Podstawy Programowania

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

ROZDZIAŁ 2. Operatory

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Dziedziczenie. dr Jarosław Skaruz

Kurs WWW. Paweł Rajba.

Przykładowa implementacja

PHP 5 język obiektowy

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

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

FUNKCJE WZORCOWE. Wykład 10. Programowanie Obiektowe (język C++) Funkcje wzorcowe wprowadzenie (2) Funkcje wzorcowe wprowadzenie (1)

Transkrypt:

Jacek Matulewski WWW: http://www.fizyka.umk.pl/~jacek/cpp/ wersja z dnia 3 listopada 2006 Najnowsza wersja: http://www.fizyka.umk.pl/~jacek/cpp/cpp-wskazniki2.pdf Źródła: http://www.fizyka.umk.pl/~jacek/cpp/cpp-wskazniki2.zip Wskaźniki do funkcji i metod Wskaźnik do funkcji Funkcja, jej typ i funkcja wywołująca funkcję o sygnaturze TFunkcja: int Funkcja(int argument)return argument; typedef int (*TFunkcja)(int); void FunkcjaWywolujacaFunkcje(TFunkcja funkcja,int argument) int wf=funkcja(argument); Testy w metodzie zdarzeniowej przycisku: int wf=funkcja(1); FunkcjaWywolujacaFunkcje(Funkcja,3); Wskaźnik do metody Zob. Wskaźnik do elementu klasy nie jest wskaźnikiem Stephen C. Dewhurst C++. Kanony wiedzy programistycznej, s. 67 i nn.

Wskaźnik do metody zawiera wskaźnik do obiektu i offset do konkretnego elementu składowego. Jednak wskaźnik do metody statycznej jest zwykłym wskaźnikiem do funkcji! int Metoda(int argument) constreturn argument; static MetodaStatyczna(int argument)return argument; ; //tu jest ukryty argument - wskaznik do instancji obiektu typedef int (TKlasa::*TMetoda)(int) const; void FunkcjaWywolujacaMetode(TKlasa* pobiekt,tmetoda metoda,int argument) int wm=(pobiekt->*metoda)(argument); void FunkcjaWywolujacaMetode(TKlasa obiekt,tmetoda metoda,int argument) int wm=(obiekt.*metoda)(argument); Testy w metodzie zdarzeniowej przycisku: int wf=funkcja(1); int wm=obiekt.metoda(2); FunkcjaWywolujacaFunkcje(Funkcja,3); FunkcjaWywolujacaFunkcje(TKlasa::MetodaStatyczna,4); //wskaznik do metody statycznej = wskaznik do funkcji FunkcjaWywolujacaMetode(&obiekt,TKlasa::Metoda,5); FunkcjaWywolujacaMetode(obiekt,TKlasa::Metoda,6); TKlasa* pobiekt=new TKlasa(); FunkcjaWywolujacaMetode(pobiekt,TKlasa::Metoda,7);

Rzutowanie metody na funkcję Problem: przekazac wskaznik do metody do funkcji FunkcjaWywolujacaFunkcje Najprostsze rozwiązanie: int FunkcjaOtaczajacaMetode(int argument) //to moglby byc obiekt globalny return obiekt.metoda(argument); FunkcjaWywolujacaFunkcje(FunkcjaOtaczajacaMetode,8); Ta sama filozofia, ale z uŝyciem szablonu: template<typename T> int SzablonFunkcjaOtaczajacaMetode(int argument) T obiekt; //to moglby byc obiekt globalny return obiekt.metoda(argument); FunkcjaWywolujacaFunkcje(SzablonFunkcjaOtaczajacaMetode<TKlasa>,11); Rzutowanie funkcji na metodę Problem: przekazac wskaznik do funkcji do funkcji FunkcjaWywolujacaMetode Rozwiązanie 1: dodać do klasy metodę wywołującą funkcję: int Metoda(int argument) constreturn argument; static MetodaStatyczna(int argument)return argument; int MetodaOtaczajacaFunkcje(int argument) const return Funkcja(argument); ;

int wm=obiekt.metoda(2); FunkcjaWywolujacaMetode(obiekt,TKlasa::MetodaOtaczajacaFunkcje,9); Rozwiązanie 2: Szablony Szablony funkcji wywołujących metodę: //template<typename T> typedef int (T::*TSzablonMetoda)(int) const; //to nie dziala w Borland template<typename T> void SzablonFunkcjaWywolujacaMetode(T* pobiekt,int (T::*metoda)(int) const,int argument) int wm=(pobiekt->*metoda)(argument); template<typename T> void SzablonFunkcjaWywolujacaMetode(T obiekt,tmetoda metoda,int argument) int wm=(obiekt.*metoda)(argument); Szablon klasy potomnej (nie trzeba modyfikować oryginalnej klasy i moŝna wskazać wywoływaną funkcję): template<typename T> class TSzablonKlasaPotomna : public T ; private: TFunkcja funkcja; TSzablonKlasaPotomna(TFunkcja funkcja):funkcja(funkcja); int NowaMetodaOtaczajacaFunkcje(int argument) const return funkcja(argument); void fastcall TForm1::Button2Click(TObject *Sender) TSzablonKlasaPotomna<TKlasa> obiektpotomnej(funkcja); FunkcjaWywolujacaMetode( obiektpotomnej, (TMetoda)(TSzablonKlasaPotomna<TKlasa>::NowaMetodaOtaczajacaFunkcje), 12);

C++Builder: słowo kluczowe closure W kompilatorach firmy Borland moŝliwe jest zadeklarowanie typu funkcji składowej (metody) w taki sposób, Ŝe metod tego typu moŝna uŝywac tak, jakby były funkcjami. SłuŜy do tego niestandardowe słowo kluczowe closure. /* ; */ int Metoda(int argument) constreturn argument; typedef int ( closure *TMetodaJakFunkcja)(int); void fastcall TForm1::Button3Click(TObject *Sender) TMetodaJakFunkcja metodajakfunkcja; metodajakfunkcja=obiekt.metoda; //blad, gdy inicjacja razem z deklaracja!!! int wmjf=metodajakfunkcja(14); Z definicji typu wynika, Ŝe modyfikator closure uzupełnia typ wskaźnika do funkcji o wskaźnik do odpowiedniego obiektu, jednak tak, Ŝe typ nie jest związany z Ŝadną konkretną klasą, lecz moŝe przechowywać metody dowolnej klasy. Nie ma znaczenia, czy przy metodzie jest słowo kluczowe const. Mechanizm ten wykorzystywany jest przez bibliotekę VCL do przechowywania wskaźników do metod zdarzeniowych. Nie oznacza to jednak, Ŝe wskaźnik typu TMetodaJakFunkcja moŝe być przekazany do funkcji FunkcjaWywolujacaFunkcje. Nie moŝe tez być przekazany do funkcji FunkcjaWywolujacaMetode. MoŜemy natomiast stworzyć nową wersję tych funkcji: void FunkcjaWywolujacaMetodeJakFunkcje(TMetodaJakFunkcja metoda,int argument) int wmjf=metoda(argument); MoŜemy to rozwiązanie przetestować: void fastcall TForm1::Button3Click(TObject *Sender) TMetodaJakFunkcja metodajakfunkcja; metodajakfunkcja=obiekt.metoda; //blad, gdy inicjacja razem z deklaracja!!! int wmjf=metodajakfunkcja(14); FunkcjaWywolujacaMetodeJakFunkcje(metodajakfunkcja,15);