Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Lab3 Dawid Mocek
- */
- #include <iostream>
- #include <string>
- #include <ctime>
- #include "Figura.h"
- #include "Kolo.h"
- #include "Kwadrat.h"
- #include "Prostokat.h"
- using std::string;
- using std::cout;
- using std::endl;
- using std::cin;
- #define FIGSIZE 10
- string randomStrGen(int length)
- {
- static string charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
- string result;
- result.resize(length);
- for (int i = 0; i < length; i++)
- result[i] = charset[rand() % charset.length()];
- return result;
- }
- double fRand(double fMin, double fMax)
- {
- double f = (double)rand() / RAND_MAX;
- return fMin + f * (fMax - fMin);
- }
- int main(void)
- {
- srand(time(NULL));
- int breakpoint;
- /*
- Zad 1 Pytania:
- Dlaczego tworzymy statyczne pole do zliczania obiektów klasy ? Dlaczego metoda wypisująca liczbę obiektów
- klasy jest statyczna ? Jakie operacje powinny mieć miejsce w konstruktorach i destruktorze ? Odpowiedź uzasadnij
- Odpowiedz: ponieważ pole statyczne jest powiązane z klasą a nie samym obiektem dlatego powstanie jedna instancja tego pola. Statyczna metoda daje nam globalny dostep do
- klasy nawet jesli jest ona nie zainicjowana. W konstruktorze musimy zadbać o zwiększenie statycznej Ilosc o +=1 w celu zliczania Instacji nowo utworzonego obiektu oraz ustawieniu
- domyślnych wartość atrybutów w celu pozbycia się `śmieci`
- Natomiast w destrutkorze zmiejszamy `Ilosc` o -=1 - usuwamy obiekt wiec liczba instancji zmniejsza się oraz po pracy na obiekcie warto ustawiać atrybuty klasy na domyslne, tak jak
- w konstruktorze.
- */
- /* Zadanie 4(1pkt) W programie stwórz tablicę 10 wskaźników na klasę bazową. Następnie wygeneruj losowo obiekty klasy bazowej lub pochodnych */
- cout << "Rezerw. pamiec dla 10 elem. Figura lub pochodnych. Kstr. _domyslny_ Figura() wykona sie 10 razy czyli static int Ilosc = 10;" << endl;
- Figura *figArr = new Figura[FIGSIZE];
- cout << "Jest ich 10 ?" << endl;
- figArr[0].Wypisz();
- for (int i = 0; i < FIGSIZE; i++)
- {
- // Każdy wygenerowany obiekt po stworzeniu powinien wypisać informację o sobie oraz
- // zostać wstawiony na kolejne miejsce tablicy.Przejrzyj tablicę po kolei i wypisz zawartość każdego obiektu.
- cout << "Iteracja nr: " << i << endl << endl;
- int rrand = static_cast<int>(fRand(1, 5));
- if (1 == rrand)
- {
- figArr[i] = Kolo("Ko: "+randomStrGen(3), fRand(20, 30));
- cout << "Ko srodku: " << figArr[i] << endl << endl;
- }
- else if (rrand == 2)
- {
- figArr[i] = Kwadrat("Kw: " + randomStrGen(3), fRand(20, 30));
- cout << "Kw srodku: " << figArr[i] << endl << endl;
- }
- else
- {
- figArr[i] = Figura("Fi: " + randomStrGen(3), fRand(20, 30));
- cout << "Fi srodku: " << figArr[i] << endl << endl;
- }
- }
- cout << "To ile mam w koncu tych instancji ?" << endl;
- figArr[0].Wypisz(); // Pokazuje 10
- delete[] figArr;
- breakpoint = 0;
- /* Pytania: Jaka jest różnica między pierwszym komunikatem wypisanym przez każdy obiekt, a kolejnym? Dlaczego tak się dzieje ?
- Odpowiedz: Nazwa i Pole ulega dynamicznej zmianie. Statyczna Ilosc już została ustawiona podczas rezerwacji pamieci przez new[] i jest stała dla już utworzonych obiektów. */
- /* Zadanie 5 (1 pkt.)
- Program z poprzedniego punktu rozbuduj o sprawdzenie liczby obiektów klasy figura w następujących
- miejscach :
- Przed rozpoczęciem generowania obiektów
- Po wygenerowaniu obiektów
- Po zwolnieniu zasobów przydzielonych obiektom
- */
- cout << "Rezerw. pamiec dla 10 elem." << endl;
- Figura *figArr2 = new Figura[FIGSIZE];
- for (int i = 0; i < FIGSIZE; ++i)
- {
- int rrand = static_cast<int>(fRand(1, 5));
- cout << "|## Przed rozpoczeciem generowania obiektu:" << endl;
- cout << "|## " << figArr2[i] << endl;
- if (1 == rrand)
- {
- figArr2[i] = Kolo("Ko: " + randomStrGen(3), fRand(20, 30));
- }
- else if (rrand == 2)
- {
- figArr2[i] = Kwadrat("Kw:" + randomStrGen(3), fRand(20, 30));
- }
- else
- {
- figArr2[i] = Figura("Fi:" + randomStrGen(3), fRand(20, 30));
- }
- cout << "|== Po wygenerowaniu obiektu" << endl;
- cout << "|== " << figArr2[i] << endl;
- cout << "|~~ Po zwolnieniu zasobów przydzielonemu obiektowi:" << endl;
- figArr2[i].~Figura();
- cout << "|~~ " << figArr2[i] << endl;
- }
- delete[] figArr2;
- breakpoint = 0;
- /* Zadanie 6 (1 pkt.)
- Napis klasę Prostokąt, która jest publiczną pochodną klasy Kwadrat. Klasa powinna zawierać:
- Wykorzystując obiekt klasy Prostokąt zaprezentuj kolejność wywoływania konstruktorów i destruktorów.
- */
- // Dla
- Prostokat *p = new Prostokat();
- /*
- Mamy:
- 1 Konst Figura::Figura()
- 2 Konst Kwadrat::Kwadrat()
- 3 Konst Prostokat::Prostokat()
- */
- // I dla
- delete p;
- /*
- Mamy:
- 1 Dest Prostokat::~Prostokat()
- 2 Dest Kwadrat::~Kwadrat()
- 3 Dest Figura::~Figura()
- */
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement