Programowanie obiektowe - wprowadzenie - Od zmiennej do...
Transcript of Programowanie obiektowe - wprowadzenie - Od zmiennej do...
-
Programowanie obiektowe - wprowadzenie
Od zmiennej do obiektu
Mirosław Głowacki 1
1Akademia Górniczo-Hutnicza im. Stanisława Staszica w KrakowieWydział Inżynierii Metali i Informatyki StosowanejKatedra Informatyki Stosowanej i Modelowania
Październik 2017
Mirosław Głowacki (AGH) Programowanie obiektowe 2017 1 / 27
-
Spis treści
1 Przykładowy program - specyfikacja wymagań
2 Programowanie imperatywne
3 Prosta wersja obiektowa
4 Wersja obiektowa z ukrywaniem informacji
5 Zastosowanie przeciążeń operatorów
6 Program w wielu plikach
Mirosław Głowacki (AGH) Programowanie obiektowe 2017 2 / 27
-
Spis treści
1 Przykładowy program - specyfikacja wymagań
2 Programowanie imperatywne
3 Prosta wersja obiektowa
4 Wersja obiektowa z ukrywaniem informacji
5 Zastosowanie przeciążeń operatorów
6 Program w wielu plikach
Mirosław Głowacki (AGH) Programowanie obiektowe 2017 3 / 27
-
Specyfikacja wymagań
Należy napisać program , który pozwoli na:
obliczenie położenia węzłówt rójkąta równobocznego, wpisanego wokrąg o zadanym promieniu - pierwszy powinien leżeć na osi OX ,zapamiętanie tych węzłów,wypisanie współrzędnych węzłów na konsoli.
Program powinien mieć dwie wersje zgodne z paradygmatami :
programowania imperatywnego,programowania obiektowo zorientowanego.
Należy również zbudować wersję rozszerzoną programu obiektowozorientowanego – trójkąt należy zastąpić wielokątem .Należy zbudować wersję programu przystosowaną dowielokrotnego użycia .
Mirosław Głowacki (AGH) Programowanie obiektowe 2017 4 / 27
-
Spis treści
1 Przykładowy program - specyfikacja wymagań
2 Programowanie imperatywne
3 Prosta wersja obiektowa
4 Wersja obiektowa z ukrywaniem informacji
5 Zastosowanie przeciążeń operatorów
6 Program w wielu plikach
Mirosław Głowacki (AGH) Programowanie obiektowe 2017 5 / 27
-
Klasyczny program imperatywny
#include #include using namespace std;
// Obliczanie współrzędnych wierzchołków trójkąta:void wezly(double* tr, double r){
const double pi = 4*atan(1.);double alfa = 0.;double dalf= 2. * pi / 3.;for(int i = 0; i < 3; i++){
int j = 2 * i;tr[j] = r*cos(alfa);tr[j+1] = r*sin(alfa);alfa += dalf;
}}
Mirosław Głowacki (AGH) Programowanie obiektowe 2017 6 / 27
-
Klasyczny program imperatywny
// Wypisywanie współrzędnych wierzchołków trójkąta:void pisz(double* tr){
cout
-
Spis treści
1 Przykładowy program - specyfikacja wymagań
2 Programowanie imperatywne
3 Prosta wersja obiektowa
4 Wersja obiektowa z ukrywaniem informacji
5 Zastosowanie przeciążeń operatorów
6 Program w wielu plikach
Mirosław Głowacki (AGH) Programowanie obiektowe 2017 8 / 27
-
Prosta wersja obiektowa
#include #include using namespace std;
// Struktury:struct punkt{
double x, y;};
struct trojkat{punkt p[3];void wezly(double);void pisz();
};
Mirosław Głowacki (AGH) Programowanie obiektowe 2017 9 / 27
-
Prosta wersja obiektowa
// Metody:void trojkat::wezly(double r){
const double pi = 4 * atan(1.);double alfa = 0.;double dalf = 2. * pi / 3.;for (int i = 0; i < 3; i++){
p[i].x = r*cos(alfa);p[i].y = r*sin(alfa);alfa += dalf; }
}void trojkat::pisz(){
cout
-
Prosta wersja obiektowa
// Program główny:int main(){
trojkat t;t.wezly(2.);t.pisz();return 0;
}
W centrum zainteresowania są struktury (lub klasy ).
Procedury zostały zastąpione tzw. metodami - funkcjamizadeklarowanymi wewnątrz struktur.Struktury pozwalają na definiowanie obiektów , a ichwzajemne relacje umożliwiają pewne wysoce pożądanemechanizmy.
Mirosław Głowacki (AGH) Programowanie obiektowe 2017 11 / 27
-
Spis treści
1 Przykładowy program - specyfikacja wymagań
2 Programowanie imperatywne
3 Prosta wersja obiektowa
4 Wersja obiektowa z ukrywaniem informacji
5 Zastosowanie przeciążeń operatorów
6 Program w wielu plikach
Mirosław Głowacki (AGH) Programowanie obiektowe 2017 12 / 27
-
Wersja obiektowa z ukrywaniem informacji
// Klasy:class punkt{
double x, y;public:
punkt(double x0 = 0., double y0 = 0.) :x(x0), y(y0){};
void pisz(){ cout
-
Wersja obiektowa z ukrywaniem informacji
// Metody:trojkat::trojkat(double r){
ileTr++;nrTr = ileTr;const double pi = 4 * atan(1.);double alfa = 0.;double dalf = 2. * pi / 3.;for (int i = 0; i < 3; i++){
p[i] = punkt( r*cos(alfa), r*sin(alfa));alfa += dalf;
}}void trojkat::pisz(){
cout
-
Wersja obiektowa z ukrywaniem informacji
// Program główny:int main(){
trojkat t;t.pisz();return 0;
}
Wprowadzono specyfikator dostępu: public
Wprowadzono pola statyczne pozwalające naprzechowywanie informacji wspólnych dla wszystkich obiektówklasy.Wewnątrz klas zdefiniowano konstruktory .
Konstruktory pozwalają na inicjalizację obiektów w tle .
Mirosław Głowacki (AGH) Programowanie obiektowe 2017 15 / 27
-
Spis treści
1 Przykładowy program - specyfikacja wymagań
2 Programowanie imperatywne
3 Prosta wersja obiektowa
4 Wersja obiektowa z ukrywaniem informacji
5 Zastosowanie przeciążeń operatorów
6 Program w wielu plikach
Mirosław Głowacki (AGH) Programowanie obiektowe 2017 16 / 27
-
Zastosowanie przeciążeń operatorów// Klasy:class punkt{
double x, y;public:
punkt(double x0 = 0., double y0 = 0.) :x(x0), y(y0){};
};class wielokat{
static int ileWielok;int nrWielok;int ileWierzch;punkt *p;
public:wielokat(int = 3, double = 1.);int nrWlk(){ return nrWielok; }int ileWier(){ return ileWierzch; }punkt punktI(int i){ return p[i]; }
};int wielokat::ileWielok = 0;
Mirosław Głowacki (AGH) Programowanie obiektowe 2017 17 / 27
-
Zastosowanie przeciążeń operatorów
// Metody:wielokat::wielokat(int ileW, double r):
ileWierzch(ileW), nrWielok(++ileWielok){p = new punkt[ileWierzch];const double pi = 4 * atan(1.);double alfa = 0.;double dalf = 2. * pi /ileWierzch;for (int i = 0; i < ileW; i++){
p[i] = punkt( r*cos(alfa), r*sin(alfa));alfa += dalf;
}}
//Przeciążenia operatora coutostream& operator
-
Zastosowanie przeciążeń operatorów
ostream& operator
-
Zastosowanie przeciążeń operatorów
Wezly wielokata nr 1:(1, 0)(-0.5, 0.866025)(-0.5, -0.866025)Wezly wielokata nr 2:(5, 0)(2.5, 4.33013)(-2.5, 4.33013)(-5, 6.12303e-016)(-2.5, -4.33013)(2.5, -4.33013)
Program przystosowano do obliczeń dla dowolnego wielokątarównobocznego - konieczna była dynamiczna deklaracja tablicoperatorem new .Zastosowano przeciążenia operatora cout - proste wypisywanieinformacji o wielokącie.
Mirosław Głowacki (AGH) Programowanie obiektowe 2017 20 / 27
-
Spis treści
1 Przykładowy program - specyfikacja wymagań
2 Programowanie imperatywne
3 Prosta wersja obiektowa
4 Wersja obiektowa z ukrywaniem informacji
5 Zastosowanie przeciążeń operatorów
6 Program w wielu plikach
Mirosław Głowacki (AGH) Programowanie obiektowe 2017 21 / 27
-
Pliki kompilowane oddzielnie
Zaletą programu umieszczonego w wielu plikach jestmożliwość oddzielnej kompilacji tych plików.Ma to szczególne znaczenie dla dużych programów i dajeoszczędność czasu kompilacji.Na ogół liczba plików jest znaczna, ale w naszym prostymprzykładzie będą trzy:
plik nagłówkowy klasy.hpp zawierający definicje klas -na ogół metody są tu jedynie deklarowane,plik klasy.cpp zawierający definicje metodplik main.cpp zawierający program główny.
Pliki z rozszerzeniem .cpp będą kompilowane oddzielnie.Plik nagłówkowy zostanie włączony do obu pozostałych plików.
Mirosław Głowacki (AGH) Programowanie obiektowe 2017 22 / 27
-
Plik nagłówkowy
#include #include
using namespace std;
// klasa punktclass punkt{
friend ostream& operator
-
Plik nagłówkowy - cd
// klasa wielokatclass wielokat{
static int ileWielok;int nrWielok;int ileWierzch;punkt *p;
public:wielokat(int = 3, double = 1.);int nrWlk();int ileWier();punkt punktI(int i);
};// operator
-
Plik z definicjami metod#include "klasy.hpp"//klasa punkt
punkt::punkt(double x0, double y0) : x(x0), y(y0){};// klasa wielokat
int wielokat::ileWielok = 0;wielokat::wielokat(int ileW, double r):
ileWierzch(ileW), nrWielok(++ileWielok){p = new punkt[ileWierzch];const double pi = 4 * atan(1.);double alfa = 0.;double dalf = 2. * pi /ileWierzch;for (int i = 0; i < ileW; i++){
p[i] = punkt( r*cos(alfa), r*sin(alfa));alfa += dalf;
} }
Mirosław Głowacki (AGH) Programowanie obiektowe 2017 25 / 27
-
Plik z definicjami metod - cdint wielokat::nrWlk(){ return nrWielok; }int wielokat::ileWier(){ return ileWierzch; }punkt wielokat::punktI(int i){ return p[i]; }
// przeciązenia operatorówostream& operator
-
Plik programu głównego
#include "klasy.hpp"
int main(){wielokat t1(3), t2(6, 5.);cout