Programowanie obiektowe 2010/2011
1
Laboratorium 9
Zad 1.
Który wiersz spowoduje błąd kompilacji i dlaczego?
class A
{
private:
int a3;
protected:
int a2;
public:
int a1;
void fa() { a1 = a2 = a3 = 0; }
};
int main()
{
A x;
x.a1 = 1;
x.a2 = 1;
x.a3 = 1;
return 0;
}
Zad. 2.
Który wiersz spowoduje błąd kompilacji i dlaczego?
class A
{
private:
int a3;
protected:
int a2;
public:
int a1;
void fa() { a1 = a2 = a3 = 0; }
};
class B : public A
{
private:
int b3;
protected:
int b2;
public:
int b1;
void fb();
};
void B::fb()
{
b1 = b2 = b3 = 0;
a1 = 1;
a2 = 2;
a3 = 3;
}
Programowanie obiektowe 2010/2011
2
int main()
{
B y;
y.a1 = 2;
y.fa();
y.a2 = 2;
y.a3 = 2;
y.b1 = 2;
y.b2 = 2;
y.b3 = 2;
}
Zad. 3. Konstruktory, przypisywanie wartości do odpowiedniego konstruktora
Zapoznaj się z programem z pliku przyklad1.cpp. Zmodyfikuj go tak, aby obiekty były tworzone za pomocą
konstruktorów.
Zad. 4. Zasłanianie metod
Uzupełnij program z poprzedniego zadania o metodę baw(). Ma ona przedstawiać ulubione zajęcie zwierzaka.
W klasie bazowej będzie to po prostu zabawa.
Zad. 5. Przeciążanie funkcji.
Uzupełnij program z poprzedniego zadania o metodę szczekaj(), w której możemy podać ile razy pies ma
zaszczekać.
Zad. 6.
Zapoznaj się z programami z plików przyklad2.cpp i przyklad3.cpp
Opracuj klasę bazową Pracownik (pracownik zatrudniony na stałe) i klasę pochodną Pracownik_godz
(pracownik zatrudniony na godziny) według przedstawionej specyfikacji klas.
class Pracownik {
int id; // identyfikator
string nazwisko; // lub char *nazwisko - wtedy destruktor
double podatek_stawka; // % podatku
protected:
double placa_brutto;
public:
Pracownik(int prac_id, string prac_nazw);
void wpisz_podatek(double nowa_stawka);
void wpisz_place(double nowa_placa);
double oblicz_place_netto(); // po odtrąceniu podatku
void drukuj_info(); // wyświetla informację o pracowniku
};
class Pracownik_godz : public Pracownik
{
double ile_godzin; // liczba przepracowanych godzin
double stawka_godz; // stawka godzinowa
public:
Pracownik_godz(int prac_id, string prac_nazw, double stawka);
void wpisz_godz(double ile);
void wpisz_stawke_godz(double stawka);
double oblicz_place();
void drukuj_info();
};
Programowanie obiektowe 2010/2011
3
Przykładowa informacja uzyskana z programu:
Pracownik: nazwisko = Kowalski
id = 1234
placa brutto = 2000
podatek = 400
placa netto = 1600
Pracownik: nazwisko = Nowak
id = 2345
placa brutto = 5000
podatek = 1000
placa netto = 4000
liczba godzin = ...
stawka = ...
Zadanie domowe
Zad. 7.
Opracuj klasę Wielokat do obsługi figur na płaszczyźnie. Klasa ta ma zawierać:
class Wielokat {
int l_bokow; // liczba boków
int *boki; // tablica z długościami boków
public:
Wielokat(); // konstruktor domyślny
Wielokat(int l_bokow); // konstruktor, gdy podana liczba boków
Wielokat(const Wielokat &w); // konstruktor kopiujący
~Wielokat(); // destruktor
// przeciążony operator przypisania
Wielokat& operator=(const Wielokat &w);
// wstawianie dlugości boku
void wpiszBok(int ktory, int dlugosc);
// wyświetlanie boków
void print();
// obliczanie obwodu
int obwod();
// w wersji obecnej: wyświetlanie komunikatu
// "Nie potrafie policzyc powierzchni"
int area();
};
// przykładowy program testowy
int main() {
Wielokat a(5);
Wielokat b = Wielokat(3); // Wielokat b(3)
Wielokat c = a;
Wielokat d;
Wielokat trojkat(3);
int bok;
cout << "Wpisz dlugosci bokow trojkata: "
for (int i = 0; i<3; i++)
{
cin >> bok;
trojkat.wpiszBok(i, bok);
}
cout << "Obwod trojkata = " << trojkat.obwod() << endl;
trojkat.drukuj(); cout << endl;
c.drukuj(); cout << endl;
endl;
}
Programowanie obiektowe 2010/2011
4
Zad. 8.
Na podstawie poprzedniego zdania utwórz hierarchię klas:
class trojkat : public wielokat;
class prostokat : public wielokat;
class kwadrat :public prostokat;
Zmodyfikuj klasę Wielokat, jeśli będzie to wymagane. Klasy pochodne mają posiadać funkcje obliczające
powierzchnię (o ile klasa macierzysta takiej funkcji nie dostarcza) oraz własne funkcje drukuj(). Każda z
funkcji drukuj() ma wyświetlić informację o typie obiektu i jego powierzchni.
Zad. 9.
Zdefiniuj klasę bazową Samochod. W klasie mają być informacje o marce (typ string), pojemność silnika (typ
int) i właścicielu samochodu (typ osoba, utworzony w poprzednim zdanaiu). Utwórz dwie klasy pochodne
Osobowy i Ciezarowy. Klasa Osobowy ma dodatkowe składowe takie jak: liczba pasażerów (typ int), pojemność
bagażnika (typ double), liczba drzwi (typ int). Klasa Ciezarowy powinna mieć dodatkowe składowe: ładowność
(typ double), liczbę osi (typ int), informację o tym, czy posiada urządzenie samowyładowcze (tak/nie, typ bool).
Zapewnij klasom rozsądną liczbę potrzebnych konstruktorów, funkcji dostępu i modyfikacji, przeciążony
operator przypisania i konstruktor kopiujący.
Napisz program testujący opracowane klasy a następnie program demonstracyjny tworzący co najmniej dwa
samochody osobowe, dwa samochody ciężarowe i wyświetlający pełne informacje o utworzonych obiektach.
Defincja klasy Osoba jest podana poniżej. Jej implementacja należy do zadania.
class Osoba {
string nazwisko;
public:
Osoba();
Osoba(string n);
Osoba(const Osoba& os);
string czytaj_nazwisko() const;
Osoba& operator=(const Osoba& os);
friend istream& operator>>(istream& we, Osoba& os);
friend osteram& operator<<(ostare& wy, const Osoba& os);
};