wyklad 14 zap i, 20 01 2014


POLITECHNIKA WARSZAWSKA
Instytut Automatyki i Robotyki
ZASADY PROGRAMOWANIA STRUKTURALNEGO
zima 2013/2014
Język programowania: C/C++
Środowisko programistyczne: Qt
Wykład 14 : Modułowa budowa programów.
Wstęp do programowania obiektowego
2
Wyświetlamy choinkę (1)
Prace gr. 39 (WebGL+Three.js)
(chwilowo nie wszystkie dostępne)
należy uruchamiać w najnowszej wersji przeglądarki Firefox
http://iair.mchtr.pw.edu.pl/bputz/ACH/Seweryn/index.html
http://iair.mchtr.pw.edu.pl/bputz/ACH/Sozynski/drzewko.html
http://iair.mchtr.pw.edu.pl/bputz/ACH/Zakrzewski/str.html
http://iair.mchtr.pw.edu.pl/bputz/ACH/Zataj/Choina.html
3
Wyświetlamy choinkę (2)
#include
using namespace std;
struct Tree {
char znak; int ilew; //ile wierszy
};
void drukuj (Tree d){
int i, j;
for ( i=1; i<=d.ilew; i++) {
for (j=1; j<=d.ilew-i; j++) cout<<" ";
for (j=1; j<=2*i-1; j++) cout<cout< }
}
int main() {
Tree d1, d2;
d1.znak='*'; d1.ilew=6; drukuj (d1);
d2.znak='@'; d2.ilew=12; drukuj (d2);
return 0;
}
4
Moduły w języku C/C++
Moduł w języku C++ tworzą dwa pliki o tej samej nazwie, ale
różnych rozszerzeniach:
" plik nagłówkowy, o rozszerzeniu *.h, zawierający deklaracje
funkcji (czyli same nagłówki funkcji ze średnikiem) oraz globalne
definicje struktur i innych typów, stałych i zmiennych.
" plik implementacji, o rozszerzeniu *.cpp, w którym znajdują się
definicje (czyli implementacje) funkcji z pliku nagłówkowego. Mogą
być w nim również zawarte definicje i deklaracje lokalne, dostępne
tylko w tym module.
Taki moduł może być dołączony jako plik nagłówkowy .h (za pomocą
dyrektywy #include) do pliku main.cpp - albo do innego modułu.
W ten sposób zamiast jednego pliku z programem mamy trzy osobne
pliki  albo więcej, gdy mamy więcej modułów.
5
Plik nagłówkowy - zasięg zmiennych i funkcji
Zmienna, funkcja, struktura zdefiniowana w module
dostępna jest we wszystkich plikach, do których
dołączymy ten moduł.
Dlatego:
" w pliku nagłówkowym umieszczamy deklaracje tylko tych funkcji
(oraz definicje struktur, stałych, zmiennych itp., zwłaszcza
powiązanych z tymi funkcjami), które są potrzebne w pliku
main lub w innych modułach.
" jeżeli z jakiejś funkcji korzystamy tylko w pliku implementacji
danego modułu, to nie ma potrzeby jej deklarowania w pliku
nagłówkowym.
UWAGA: zmienne, funkcje itp. zadeklarowane w głównym pliku z
programem nie są widoczne w module dołączonym do tego
programu - bo skąd moduł miałby "wiedzieć", do jakiego
programu jest dołączony?
6
Przykład  choinka modułowa (moduł choinka)
Plik nagłówkowy choinka.h
zawiera definicję struktury Tree i deklarację funkcji drukuj
#ifndef CHOINKA_H // to dostaniemy w szkielecie
#define CHOINKA_H // to też
using namespace std;
struct Tree {
char znak; int ilew; //ile wierszy
};
void drukuj (Tree d);
//tu tylko deklaracja funkcji, czyli nagłówek i średnik
#endif // CHOINKA_H to też należy do szkieletu
7
Druga część modułu choinka
Plik implementacji choinka.cpp
zawiera pełną definicję funkcji drukuj
#include  choinka.h
//uwaga: tu są cudzysłowy, bo to nasz własny moduł
#include
//a tu nawiasy ostre, bo to biblioteka standardowa
void drukuj (Tree d){
int i, j;
for ( i=1; i<=d.ilew; i++) {
for (j=1; j<=d.ilew-i; j++) cout<<" ";
for (j=1; j<=2*i-1; j++) cout< cout< }
8
Plik główny programu
Plik main.cpp
wykorzystuje strukturę Tree i funkcję drukuj
zdefiniowane w dołączonym module choinka
#include  choinka.h
int main() {
Tree d1, d2;
d1.znak='*'; d1.ilew=6; drukuj (d1);
d2.znak='@'; d2.ilew=12; drukuj (d2);
return 0;
}
9
Moduły - podsumowanie
Moduł choinka, złożony z plików:
" choinka.h
" choinka.cpp
posłużył do powiązania ze sobą:
" typu rekordowego (struktury Tree)
oraz:
" funkcji drukuj działającej na polach tej struktury.
Powiązanie to ma jednak tylko formalny charakter,
związany z umiejscowieniem ich definicji.
Logiczne powiązanie tych definicji zapewni nowy typ
danych  klasa.
10
Klasy - wprowadzenie
Klasa jest złożonym typem danych (tzw. typem
obiektowym), który łączy ze sobą pola opisujące dane
i metody ich przetwarzania (funkcje działające na tych
polach). Mówimy, że pola i funkcje są składowymi klasy.
Zatem:
" typ rekordowy (strukturę) definiuje się za pomocą pól
" typ obiektowy (klasę) definiuje się za pomocą pól
i funkcji na nich działających (tzw. metod).
i analogicznie:
" zmienne typu rekordowego nazywamy rekordami
" zmienne typu obiektowego nazywamy obiektami (tzw.
instancjami klasy).
11
Klasy i obiekty
UWAGA:
Klasa i obiekt to nie to samo. Klasa to typ
obiektowy, a nie konkretny obiekt.
analogicznie jak:
Struktura i rekord to nie to samo. Struktura to typ
rekordowy, a nie konkretny rekord.
12
Klasy  przykład 1: wszystko w jednym pliku
#include
using namespace std;
class Tree {
private:
char znak; //pole prywatne
int ilew; //pole prywatne
public:
Tree ( ) { // bezparametrowy konstruktor domyślny
// wywoływany w trakcie inicjowania obiektu
// ma nazwę taką, jak nazwa klasy i nie ma typu (!)
znak='V'; ilew=10; // ustawia pola początkowe obiektów
}
void ustawDane(char znak, int ilew){ //metoda publiczna
this->znak = znak;
this->ilew = ilew;
}
// UWAGA: wskaznik this jest ustawiony na adres obiektu
// wywołującego daną metodę;
// oznacza: wez ten obiekt, który metodę wywołał
// dzięki temu parametr metody może mieć taką samą nazwę, jak pole klasy
13
Klasy  przykład 1, c.d.
void drukuj ( ) { // metoda publiczna
int i, j;
for ( i=1; i<= ilew; i++) {
for (j=1; j<= ilew-i; j++) cout<<" ";
for (j=1; j<=2*i-1; j++) cout<< znak;
cout< }
}
}; // koniec definicji klasy Tree
int main( ){
Tree d1, d2;
d1. drukuj();
d2. drukuj();
d1.ustawDane('O', 11);
d1. drukuj();
return 0;
}
14
Składowe prywatne i publiczne klasy
" Pola i metody publiczne (public) są dostępne z
dowolnego miejsca w programie
" Pola i metody prywatne (private) są dostępne tylko dla
metod danej klasy
" Domyślnie (jeśli nie zadeklarujemy inaczej) wszystkie
pola i metody są prywatne.
Ukrywanie prywatnych pól i metod klasy (tzw. hermetyzacja lub
enkapsulacja), służy między innymi do zabezpieczenia przed błędami,
takimi jak niekontrolowana zmiana wartości pól przez funkcje spoza
danej klasy.
Jeśli więc chcemy mieć dostęp do pól prywatnych jakiejś klasy,
musimy zdefiniować w tej klasie metody publiczne zapisujące i
odczytujące te pola.
Przykład: funkcja ustawDane() , która ustawia wartości pól
prywatnych znak oraz ilew.
15
Przykład 2  implementacje na zewnątrz klasy (1)
#include
using namespace std;
class Tree {
private:
char znak;
int ilew;
public:
Tree ( ) ;
void ustawDane(char znak, int ilew);
void drukuj( );
} //koniec definicji klasy Tree
// teraz będą implementacje metod:
Tree :: Tree ( ) { //nazwa klasy::nazwa konstruktora
znak='V'; ilew=10;
}
16
Przykład 2  implementacje na zewnątrz klasy (2)
void Tree :: ustawDane(char znak, int ilew){
//typ metody nazwa klasy::nazwa metody
this->znak = znak;
this->ilew = ilew;
}
void Tree :: drukuj ( ) {
int i, j;
for ( i=1; i<= ilew; i++) {
for (j=1; j<= ilew-i; j++) cout<<" ";
for (j=1; j<=2*i-1; j++) cout<< znak;
cout< }
}
17
Przykład 3  klasa zdefiniowana w module tree (1)
Plik nagłówkowy tree.h
zawiera definicję klasy Tree
#ifndef TREE_H
#define TREE_H
using namespace std;
class Tree {
private:
char znak;
int ilew;
public:
Tree ( ) ;
void ustawDane(char znak, int ilew);
void drukuj ( );
}
#endif // TREE_H
18
Przykład 3  klasa zdefiniowana w module tree (2)
Plik implementacji tree.cpp
zawiera implementacje metod klasy Tree
#include  tree.h
#include
Tree :: Tree ( ) {
znak='V'; ilew=10;
}
void Tree :: ustawDane(char znak, int ilew){
this->znak = znak;
this->ilew = ilew;
void Tree :: drukuj ( ) {
int i, j;
for ( i=1; i<= ilew; i++) {
for (j=1; j<= ilew-i; j++) cout<<" ";
for (j=1; j<=2*i-1; j++) cout<< znak;
cout< }
}
19
Przykład 3  klasy definiowane w modułach (3)
Plik main.cpp
wykorzystuje klasę Tree zdefiniowaną w dołączonym module tree
#include  tree.h
int main( ){
Tree d1, d2;
d1. drukuj();
d2. drukuj();
d1.ustawDane('O', 11);
d1. drukuj();
return 0;
}
20
Dziedziczenie - schemat
class Tree { // klasa bazowa
private:
..
public:
..
protected: // pola i metody chronione
..
}
// klasa Choinka pochodna względem klasy Tree
class Choinka : public Tree {
// definiujemy dodatkowe pola i metody specyficzne tylko dla klasy
// pochodnej Choinka (np. metodę rysowania bombek, ich ilość itp.)
}
Klasa Choinka dziedziczy publiczne pola i metody klasy bazowej Tree.
Pola i metody prywatne klasy bazowej Tree są niedostępne w klasie
Choinka.
Pola i metody chronione klasy bazowej Tree dostępne są tylko w
implementacjach metod klasy pochodnej Choinka.


Wyszukiwarka

Podobne podstrony:
wyklad zap i, 8 01 2014
BÓLE GŁOWY, WYKŁAD 4, 24 01 2014
BÓLE GŁOWY, WYKŁAD 2, 10 01 2014
wyklad 7 zap i, 11 2013
wyklad 8 zap i, 11 2013
wyklad 3 zap i,! 10 2013
zestawienie 4 01 2014
BO II stacjonarne wykład nr 01
Incomings SCORE w Krakowie 02 06 01 2014
Zadania z wykładu 28 05 2014
Wykład7 NOO UG 2014 TajemniczyMistrzowie i Lean
zestawienie 01 2014

więcej podobnych podstron