Proste klasy, kompozycja, dziedziczenie, polimorfizm
1) Napisz klasę String, która zawiera atrybut będący 32 znakową tablicą.
· Dodaj konstruktor String(const char*txt) -- ustala wartość atrybutu i wypisuje „String” i wartość atrybutu
· oraz destruktor ~String() – wypisuje „~String” i wartość atrybutu)
·
Dodaj metody void
set(const char*txt)
·
oraz const char*get()const.
Utwórz obiekt:
· globalny
· lokalny
·
na stercie String*str=new String(”na stercie”);
·
tablicę obiektów typu String
2) Napisz klasę Data atrybutami:
int dzien;
int miesiac;
int rok;
Dodaj konstruktor z parametrami (ma ustawić atrybuty i wypisywać Data) i destruktor (w celach informacyjnych wypisuje ~Data)
3) Kompozycja
Napisz klasę Osoba z atrybutami:
· String imie;
· String nazwisko;
·
Data
dataUrodzenia
Dodaj konstruktor i destruktor wypisujący, informacje o ich wywołaniu. Konstruktor ma ustawiać wszystkie atrybuty przez listę inicjalizacyjną.
Osoba(const char*im, const char*naz,
int d, int m, int r)
:imie(im),
{}
// Osoba jk(„Jan”,”Kowalski”,7,2,1983);
Przetestuj utworzenie różnego typu obiektów (globalny, lokalny, dynamicznie tworzony na stercie)
4) W klasie String, Data i Osoba dodaj funkcję void write(ostream&os)
Przetestuj wypisywanie zawartości obiektu.
5) Asocjacje.
W klasie Osoba dodaj pola Osoba*ojciec i Osoba*matka.
W konstruktorze nadać zerowe wartości.
Dodaj funkcje do ich ustawiania: setFather(Osoba*father) setMother(Osoba*mother)
Zamodeluj następującą sytuację:
· Anna Kowalska i Michał Kowalski są dziećmi Jana Kowalskiego i Joanny Kowalskiej
· Jan Kowalski jest synem Izabeli Kowalskiej i Piotra Kowalskiego
· Joanna Kowalska jest córką Andrzeja Nowaka i Krystyny Nowak
Wskazówka: zadeklaruj tablicę wskaźników Osoba*osoby[???]. Twórz obiekty dynamicznie i zwalniaj pamięć przy wyjściu z funkcji main().
6) W klasie Osoba dodaj tablicę Osoba*dzieci[10] i atrybut int licznikDzieci.
Dodaj funkcję void addChild(Osoba*)
Zmodyfikuj funkcje setFather() i setMother() , aby ustawiała asocjacje w drugą stronę. Wypisz informacje o rodzinie.
Uzupełnij funkcję write(), tak aby wypisywała informacje o ojcu i matce.
Aby uniknąć nieskończonej rekurencji, zmodyfikuj funkcję write w klasie Osoba: zmień jej deklarację na
void
write(ostream&os, bool shortInfo=false);
7) Dziedziczenie.
· Utwórz klasy Kobieta i Mezczyzna dziedziczące po klasie Osoba
· W klasie Kobieta dodaj atrybut nazwiskoPanienskie, zmodyfikuj konstruktor i przedefiniuj funkcje write, tak aby wypisywała dodatkowe informacje (płeć) i dodatkowy atrybut
· Podobnie w klasie Mezczyzna .
Fragmenty kodu
#include
<iostream.h>
#define
xxTRACE
class
String
{
char
buf[32];
public:
String(const char*txt="");
//String();
~String();
void set(const char*txt);
const char*get()const;
//const char*get()const {
/* */ }
void write(ostream&os){os<<buf;}
};
class Data
{
int dzien, miesiac, rok;
public:
Data(int d,int m, int r);
~Data();
void
write(ostream&os){os<<dzien<<"."<<miesiac<<"."<<rok;}
};
class Osoba
{
String imie;
String nazwisko;
Data dataUrodzenia;
public:
Osoba(const char*im, const char*naz, int
d, int m, int r);
~Osoba(){
#if
defined TRACE
cout<<"~Osoba"<<endl;
#endif
}
void write(ostream&os);
};
/////////////////////////////////////////
#include
<string.h>
void
String::set(const char*txt)
{
strcpy(buf,txt);
}
const
char*String::get()const
{
return buf;
}
String::String(const
char*txt)
{
set( txt);
#if
defined TRACE
cout<<"String "<<buf<<endl;
#endif
}
String::~String()
{
#if
defined TRACE
cout<<"~String "<<buf<<endl;
#endif
}
Data::Data(int
d,int m, int r)
:dzien(d),
miesiac(m), rok(r)
{
#if
defined TRACE
cout<<"Data"<<endl;
#endif
}
Data::~Data()
{
#if
defined TRACE
cout<<"~Data"<<endl;
#endif
}
Osoba::Osoba(const
char*im, const char*naz, int d, int m, int r)
:imie(im),
nazwisko(naz), dataUrodzenia(d,m,r)
{
#if
defined TRACE
cout<<"Osoba"<<endl;
#endif
}
void
Osoba::write(ostream&os)
{
imie.write(os);
os<<"
";
nazwisko.write(os);
os<<" ";
dataUrodzenia.write(os);
os<<endl;
}
////////////////////////////////////////////////////////////
// globalny
//Osoba
jk("Jan","Kowalski",23,2,1978);
/////////////////////////////////////////////////////////////////
void
main()
{
Osoba*tab[8];
tab[0]=new Osoba("Anna",
"Kowalska", 1,4,2006);
tab[1]=new Osoba("Michal",
"Kowalski", 1,6,2005);
///
for(i=0;i<8;i++)tab[i]->write(cout);
for(i=0;i<8;i++)delete tab[i];
}