May 6, 2024, Monday, 126

Przykładowe zadania do Laboratorium 6

From MJanik

Jump to: navigation, search

Po ostatnich zajęciach na pewno spodziewajcie się państwo konstruktorów. Będą się pojawiały w kolejnych zadaniach aż po Dzień Sądu.

Ponadto będziecie baństwo pisać pierwszy program wykorzystujący dziedziczenie.

1. W tym zadaniu należy wykorzystać istniejącą klasę prostokąt. Należy zmodyfikować ją w taki sposób, by dziedziczyła z klasy figura (posiadającej w polach składowych punkty x, y oraz kolor). Prostokąt, będzie rozszerzeniem klasy figura o dwa dodatkowe pola: długości boków a oraz b.

Obie klasy (figura oraz prostokąt) powinny posiadać własne, oddzielne konstruktory.

2. Monitorujemy ruch na morzu Śródziemnym. Należy stworzyć klasę podstawową srodek_transportu, posiadającą dwa składniki: float poz_x oraz float poz_y. Oraz dwie klasy pochodne: statek_wodny (posiadający dwa int'y: dlugosc statku oraz ilosc zagli) oraz statek_latajacy (posiadający jeden składnik int mogący przyjmować 0 (samolot), 1 (śmigłowiec) lub 2 (szybowiec) - poleca się stworzenie typu wyliczeniowego enum.) Dla klas pochodnych należy stworzyć odpowiednie konstruktory. W funkcji main należy stworzyć po jednym statku wodnym oraz statku latającym, oraz wypisać ich charakterystyki.

Powtórka

Klasy, czyli definiowanie własnych typów danych.

Oprócz typu int, double, char tworzymy własny typ danej, np. Prostostokąt. Wewnątrz ciała klasy definiuje się składniki klasy oraz funkcje składowe (metody).

Gdy tworzymy klasę oznacza to, że tworzymy szablon, nowy typ, którym będziemy się następnie posługiwać wewnątrz kodu programu.

class nowy_typ{ public: int a, b; };

Gdy tworzymy obiekt, instancję danej klasy, oznacza to, że tworzymy konkretny obiekt, zajmujący określone miejsce w pamięci, mający własne, charakterystyczne dla niego wartości składników.

nowy_typ A; - deklaracja obiektu A klasy nowy_typ.
nowy_typ *A; - deklaracja wskaźnika A na obiekty nowy_typ;

Jeśli stworzyliśmy wskaźnik na obiekt, nie oznacza to, że stworzyliśmy również obiekt, na który nasz wskaźnik wskazuje. Taki wskaźnik możemy sobie wyobrazić jako zawieszoną w przestrzeni strzałkę, która jeszcze nie wskazuje na żaden obszar pamięci, ale mogła by wskazywać na taki, w którym byśmy przechowywali obiekt klasy nowy_typ.

By zadeklarować wskaźnik wraz z obiektem, korzystamy z operatora new:

nowy_typ *B = new nowy_typ();

lub, korzystając z uprzednio stworzonego wskaźnika:

A = new nowy_typ();

Aby odnieść się do składników obiektu możemy posługiwać się jedną z poniższych notacji:

obiekt.składnik
wskaźnik->składnik
referencja.składnik

Aby wywołać metodę na danym obiekcie:

obiekt.metoda(); - dla metody bezargumentowej, pamiętamy o nawiasach!
obiekt.metoda(arg1, arg2, …); – dla metody przyjmującej argumenty, podajemy je po przecinku. Przy wywoływaniu metody nie deklarujemy typów podawanych argumentów (nie piszemy np. int i, tylko używamy zadeklarowanej wcześniej zmiennej i). Podobnie dla wskaźników:
wskaźnik->metoda(arg1, arg2, …);

Na końcu deklaracji klasy należy pamiętać o średniku!

Konstruktory

Konstruktor to specjalna funkcja składowa, która nazywa się tak samo, jak klasa. Wewnątrz konstruktora możemy zamieścic instrukcje nadające wartości początkowe składnikom definiowanego właśnie obiektu. Konstruktory:

Nie zwracają nic, nawet typu „void”! (Uwaga, po napisaniu konstruktorów należy pamiętać, że wszystkie inne metody muszą zwracać jakiś typ (chociażby „void”). Z rozpędu łatwo o tym zapomnieć).

Konstruktorem dla klasy nowy_typ mógłby być:

class nowy_typ{ public: int a, b;
nowy_typ(){a=0;b=0;} - konstruktor domyślny
nowy_typ(int A, int B){ a=A; b=B;} - konstruktor dwuparametrowy
}

Konstruktory wywoływane są automatycznie, gdy program napotyka definicję danego obiektu.

nowy_typ C; - w tym momencie wywołany jest konstruktor domyślny
nowy_typ C(2,3); - w tym momencie wywołany jest konstruktor dwuparametrowy

Lub też, gdy używamy operatora new:

nowy_typ *C = new nowy_typ();
nowy_typ *C = new nowy_typ(2,3);

Dziedziczenie Dziedziczenie jest to technika pozwalająca na definiowanie nowej klasy, przy wykorzystaniu klasy już wcześniej istniejącej. Często się zdarza, że mamy kilka klas podobnych do siebie. Możemy wtedy stworzyć klasę podstawową, zawierającą część wspólną wszystkich klas, a następnie tworzyć klasy pochodne, zgodnie ze zdaniem „Chcę mieć taką samą klasę jak moja klasa podstawowa, z małymi różnicami. Różnice podaję poniżej...”.

Dziedziczenie = Tworzenie klas pochodnych