Funkcje i klasy zaprzyjaźnione

Podobne dokumenty
Wstęp do Programowania 2

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

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

Pola i metody statyczne

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 w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

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

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

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

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

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

Szablony. Szablony funkcji

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

Plik klasy. h deklaracje klas

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

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

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

PARADYGMATY PROGRAMOWANIA Wykład 2

Przeciążenie (przeładowanie nazw) funkcji

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

Abstrakcyjny typ danych

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

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

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

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 2. Język C++. Wykład Relacje między klasami, klasy zagnieŝdŝone, klasy lokalne

Programowanie - wykład 4

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

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

Język C++ Różnice między C a C++

Programowanie komputerowe. Zajęcia 2

Programowanie Obiektowe i C++

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

Projektowanie klas c.d. Projektowanie klas przykład

Techniki Programowania przeładowanie funkcji

Język C++ zajęcia nr 2

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

Przesłanianie nazw, przestrzenie nazw

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Przekazywanie argumentów wskaźniki

Wykład 8: klasy cz. 4

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

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

Informatyka 2. Wykład nr 3 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Przeciążanie operatorów

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

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

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Programowanie obiektowe w C++ Wykład 12

Zwracanie obiektu. Funkcja może zwracać obiekty: #include"stdafx.h #include <iostream> using namespace std; class samp { inti; public:

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

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

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

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

Wstęp do wiadomości teoretycznych (nie, nie jest to masło maślane ani wstęp, wstępów proszę cierpliwie czytać)

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

PROGRAMOWANIE OBIEKTOWE W C++ - cz 1. Definicja klasy, składniki klasy, prawa dost pu, definiowanie funkcji składowych, konstruktory i destruktory.

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

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

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

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

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

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

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Podstawy Programowania Obiektowego

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

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

Nowe słowa kluczowe. Komentarze. Wskaźniki typu void. class, delete, new, friend,... /* Komentarz w C i C++ */ // Komentarz w C++ (do końca wiersza)

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

Wskaznik. Przekazywanie wyniku funkcji przez return. Typy i zmienne wskaznikowe. Zmienna wskazywana. typ * nazwa_wkaznika

Część 4 życie programu

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

Wprowadzenie do szablonów szablony funkcji

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

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM

PARADYGMATY PROGRAMOWANIA Wykład 3

Programowanie obiektowe język C++

Wstęp do programowania

Wprowadzenie do szablonów szablony funkcji

Dziedziczenie & W slajdach są materiały zapożyczone z

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Szablony klas, zastosowanie szablonów w programach

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

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody

Programowanie komputerowe. Zajęcia 7

Wstęp do Programowania, laboratorium 02

Podstawy Programowania Obiektowego

Wstęp do programowania

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

Operatory na rzecz typu TString

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

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

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

Programowanie obiektowe w języku

Język C++ wykład VIII

Programowanie obiektowe w języku C++ Zarządzanie procesami. dr inż. Jarosław Forenc. Przeładowanie (przeciążanie) operatorów

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

TEMAT : KLASY DZIEDZICZENIE

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.

Transkrypt:

Funkcje i klasy zaprzyjaźnione Funkcje zaprzyjaźnione Obiekty klas mogą być argumentami zwykłych funkcji i metod innych klas enkapsulacja i hermetyzacja danych funkcje nie będące składnikiem klasy mają dostęp tylko do publicznych składników klasy niekiedy to jest niekorzystne (przykład: dom, kwiatki) o klasa: dom składowe prywatne: kwiatki o gdy urlop, to możliwe wyjścia: zmienić status kwiatków albo poprosić przyjaciela w C++ jest możliwość, by funkcja nie będąca składnikiem klasy miała do niej pełny dostęp warunek dostępu deklaracja przyjaźni w ciele klasy: Przykład: friend typ_wyniku nazwa_funkcji(lista_argumentów); class samochod int nr; static int ile_aut; int cena; samochod(int ll) nr=ll; ile_aut++; friend void dane(samochod &); int samochod::ile_aut=1000; void dane(samochod &a) cout << Auto nr: <<a.nr <<endl; cout << Calkowita ilosc aut: <<a.ile_aut <<endl; samochod a1(1001); dane(a1);

uwagi na temat deklaracji przyjaźni: o deklaracja musi być uczyniona w ciele klasy (to klasa określa kto jest jej przyjacielem, a nie funkcja - z kim się przyjaźni) o funkcja przyjaciel ma pełny dostęp do składników klasy (nie jest możliwy dostęp selektywny) o funkcja zaprzyjaźniona nie jest składnikiem klasy nie ma wskaźnika this obiektu odnosi się do składnika obiektu poprzez obiekt.składnik lub wskaźnik->składnik jaki jest sens deklarowania relacji przyjaźni z zewnętrzną funkcją czy nie lepiej uczynić z niej metody klasy? często tak, ale funkcje zewnętrzne mogą mieć pewne przewagi: o funkcja może być przyjacielem więcej niż jednej klasy o funkcja zaprzyjaźniona może wykonywać na swoich argumentach konwersje o dzięki mechanizmowi deklaracji przyjaźni możemy pozwolić na pełny dostęp do obiektu klasy funkcjom napisanym w innych językach Przykład: funkcja zaprzyjaźniona z dwoma klasami #include <stdio.h> #include <string.h> class kwadrat; class punkt int x, y; char nazwa[20]; punkt(int a, int b, char *opis); void przesun(int n, int m) x+=n; y+=m; friend int sedzia(punkt & p, kwadrat & k); class kwadrat int x, y, bok; char nazwa[20]; kwadrat(int a, int b, int bb, char *opis); friend int sedzia(punkt & p, kwadrat & k); // deklaracja zapowiadająca // konstruktor - deklaracja // konstruktor - deklaracja

punkt::punkt(int a, int b, char* opis) x=a; y=b; strcpy(nazwa,opis); // konstruktor - definicja kwadrat::kwadrat(int a, int b, int bb, char* opis) // konstruktor - definicja x=a; y=b; bok=bb; strcpy(nazwa,opis); int sedzia(punkt & p, kwadrat & k) printf("polozenie: (%d,%d)\n",p.x,p.y); if ( (p.x>=k.x)&&(p.x<=(k.x+k.bok)) && (p.y>=k.y)&&(p.y<=(k.y+k.bok))) printf("%s lezy na tle %s\n",p.nazwa,k.nazwa); return 1; else printf("aut! %s jest na zewnatrz %s\n",p.nazwa,k.nazwa); return 0; main() punkt pi(20,20,"pilka"); kwadrat bo(10,10,40,"boiska"); sedzia(pi,bo); printf("kopiemy pilke dopoki jest w boisku!\n"); while (sedzia(pi,bo)) pi.przesun(20,20); Uwaga: w czasie deklaracji klasy punkt musimy podać typy argumentów funkcji zaprzyjaźnionej sedzia w tym typ kwadrat, który nie jest jeszcze zdefiniowany. Gdy zmienimy kolejność klas, to sytuacja się nie zmieni. Wyjście deklaracja zapowiadająca (zwiastująca): class kwadrat;

Wydruk programu polozenie: (20,20) pilka lezy na tle boiska kopiemy pilke dopóki jest w boisku! polozenie (20,20) pilka lezy na tle boiska polozenie (40,40) pilka lezy na tle boiska polozenie (60,60) Aut! pilka jest na zewnatrz boiska na ogół w ciele klasy tylko deklaracja funkcji zaprzyjaźnionej, definicja jest na zewnątrz ciała może zdarzyć, że definicja definicja klasy zaprzyjaźnionej też jest w ciele klasy; wtedy to ta funkcja: o jest typu inline o nie staje się pomimo to metodą klasy, tylko zostaje przyjacielem o pozostaje w zasięgu leksykalnym klasy (może wykorzystywać z dokonanych w klasie instrukcji typedef oraz określonych tam typów wyliczeniowych enum) gdy nazwa funkcji zaprzyjaźnionej jest przeładowana, to przyjacielem klasy jest tylko ta wersja funkcji, która ma listę argumentów odpowiadającą liście w deklaracji przyjaźni dokonanej w klasie class K // friend int fun(int, K &); //.. int fun(char a, int b); int fun(k a, int b); int fun(int a, K &b); // to jest funkcja zaprzyjaźniona

funkcja zaprzyjaźniona z daną klasą może być metodą innej klasy ma ona wtedy dostęp do wszystkich składowych obu klas jeżeli funkcja zaprzyjaźniona z klasą A jest metodą klasy B, to wymaga się, by w momencie dokonywania deklaracji przyjaźni w A, klasa B musi być już znana to wymusza określony porządek definicji klas: class A; class B //.. int fun(a &); //.. class A //.. friend int B::fun(A &); //.. Przykład: modyfikujemy poprzedni przykład, by funkcja sędzia była metodą klasy kwadrat, zaprzyjaźnioną z klasą punkt #include <stdio.h> #include <string.h> class punkt; class kwadrat int x, y, bok; char nazwa[20]; kwadrat(int a, int b, int bb, char *opis); int sedzia(punkt & p); class punkt int x, y; char nazwa[20]; punkt(int a, int b, char *opis); void przesun(int n, int m) x+=n; y+=m; friend int kwadrat::sedzia(punkt & p); // deklaracja zapowiadająca // konstruktor - deklaracja // konstruktor - deklaracja

punkt::punkt(int a, int b, char* opis) x=a; y=b; strcpy(nazwa,opis); kwadrat::kwadrat(int a, int b, int bb, char* opis) x=a; y=b; bok=bb; strcpy(nazwa,opis); int kwadrat::sedzia(punkt & p) printf("polozenie: (%d,%d)\n",p.x,p.y); if ( (p.x>=x)&&(p.x<=(x+bok)) && (p.y>=y)&&(p.y<=(y+bok))) printf("%s lezy na tle %s\n",p.nazwa,nazwa); return 1; else printf("aut! %s jest na zewnatrz %s\n",p.nazwa,nazwa); return 0; int main() punkt pi(20,20,"pilka"); kwadrat bo(10,10,40,"boiska"); bo.sedzia(pi); printf("kopiemy pilke dopoki jest w boisku!\n"); while (bo.sedzia(pi)) pi.przesun(20,20); system("pause"); return 0; ogólnie gdy chcemy, by funkcja miała pełny dostęp do składowych dwóch klas, to możemy to zrealizować jako: o funkcję przyjaciela obu klas o metoda jednej a funkcja zaprzyjaźniona drugiej klasy

Klasy zaprzyjaźnione jeżeli klasa A deklaruje przyjaźń ze wszystkimi funkcjami składowymi klasy B, to możemy to zapisać jako deklarację przyjaźni z klasą B: class A friend class B; // ciało klasy A jeżeli klasa A deklaruje przyjaźń w stosunku do klasy B, to nie wynika z tego nic na temat stosunku klasy B do klasy A (przyjaźń nie jest symetryczna) jeżeli klasa A deklaruje przyjaźń w stosunku do klasy B, zaś B w stosunku do klasy C, to z tego nie wynika nic na temat stosunku A do C (przyjaźń nie jest przechodnia) istnieje możliwość, aby klasy przyjaźniły się wzajemnie nie da się zrobić tak, by klasa A przyjaźniła się z kilkoma wybranymi metodami klasy B, zaś B z kilkoma wybranymi metodami klasy A (powód wymóg, by w momencie, w którym dokonujemy deklaracji przyjaźni do metody danej klasy była ona już zdefiniowana) jedyne możliwe rozwiązanie wzajemna deklaracja przyjaźni obu klas jako całości class B; class A friend class B; //.. reszta ciała klasy A class B friend class A; //.. reszta ciała klasy B // deklaracja zapowiadająca zakładamy, że zakres ważności funkcji zaprzyjaźnionej z klasą jest taki sam, jak zakres ważności klasy. Na ogół zakres ważności klasy globalny. Gdyby zakres funkcji zaprzyjaźnionej ograniczony do pliku (klauzula static) błąd kompilacji.

Funkcje zaprzyjaźnione podsumowanie 1. Pojedyńcza klasa, funkcja nie bedąca jej funkcją składową class K private: friend void fz(int xa, K & k); wywołanie: K k; fz(x,k); w ciele funkcji fz: k.x=k.x+x;

2. Dwie klasy, funkcja nie będąca funkcją składową żadnej z nich ma mieć dostęp do wszystkich pól po class K2; class K1 private: friend void fz(k1 & k1, K2 & k2); class K2 private: friend void fz(k1 & k1, K2 & k2); wywołanie: K1 o1; K2 o2; fz(o1, o2); w ciele funkcji fz: o1.x=o1.x+o2.x; 3. Dwie klasy, funkcja fs1z2 ma być funkcją składową pierwszej klasy a zaprzyjaźnioną drugiej class K2; class K2; class K1

private: void fs1z2(k2 & k2); class K2 private: friend void K1::fsz2(K2 & k2); wywołanie: K1 o1; K2 o2; o1.fs1z2(o2); w ciele funkcji fs1z2: x=x+o2.x;