Laboratorium 4

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];

 

}