Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <typeinfo>
- using namespace std;
- class Widget {
- private:
- int id;
- static int globalId;
- protected:
- string name;
- public:
- int getWidgetId(){
- return id;
- }
- string getWidgetName() {
- return name;
- }
- void setWidgetName(string name) {
- this->name = name;
- }
- void wypisz() {
- cout << "Class name: Widget" << endl;
- cout << "Id: " << id << endl;
- cout << "Object name: " << name << endl;
- }
- Widget() {
- this->id = globalId;
- Widget::globalId++;
- cout << "Class name: Widget created" << endl;
- }
- Widget(string name) {
- this->name = name;
- this->id = Widget::globalId;
- Widget::globalId++;
- cout << "Class name: Widget created" << endl;
- }
- ~Widget(){
- cout << "Class name: Widget destroyed" << endl;
- }
- };
- // !!! Inicjalizacja statycznej zmiennej
- int Widget::globalId = 0;
- class TextBox : public Widget {
- // Tak dlugo jak nie jestesmy na koncu hierarchii dziedziczenia pola powinny raczej byc protected, w razie gdyby powstala klasa dziedziczaca po tej. O ile taka klasa powinna miec dostep do tego pola. Jezeli jestesmy pewni ze takie pole powinno byc dostepne tylko i wylacznie w tej klasie, nawet nie w jej dziecku, to powinno byc private. Nigdy nie wiadomo czy nie bedzie trzeba utworzyc takiego dziecka.
- protected:
- string text;
- public:
- string getText() {
- return text;
- }
- void setText(string text) {
- this->text = text;
- }
- void wypisz() {
- Widget::wypisz(); // wypisuje rodzica
- cout << "Text: " << text << endl; // wypisuje dodatkowe informacje z tej klasy
- }
- TextBox() {
- cout << "Class name: TextBox created" << endl;
- }
- ~TextBox() {
- cout << "Class name: TextBox destroyed" << endl;
- }
- };
- class Slider : public Widget{
- protected:
- int zakres;
- int wartosc;
- public:
- int getZakres() {
- return zakres;
- }
- int getWartosc() {
- return wartosc;
- }
- void setZakres(int zakres) {
- this->zakres = zakres;
- }
- void setWartosc(int wartosc) {
- this->wartosc = wartosc;
- }
- void wypisz() {
- Widget::wypisz(); // wypisuje rodzica
- cout << "Zakres: " << zakres << endl; // wypisuje dodatkowe informacje z tej klasy
- cout << "Wartosc: " << wartosc << endl;
- }
- Slider() {
- cout << "Class name: Slider created" << endl;
- }
- ~Slider() {
- cout << "Class name: Slider destroyed" << endl;
- }
- };
- class PasswordTextBox : public TextBox {
- private:
- char znakMaska;
- public:
- PasswordTextBox() {
- cout << "Class name: PasswordTextBox created" << endl;
- }
- ~PasswordTextBox() {
- cout << "Class name: PasswordTextBox destroyed" << endl;
- }
- };
- int main()
- {
- Widget widget("W1");
- widget.wypisz();
- cout << endl;
- TextBox textBox;
- textBox.wypisz();
- cout << endl;
- PasswordTextBox pwTextBox;
- pwTextBox.wypisz();
- cout << endl;
- Slider slider;
- slider.wypisz();
- cout << endl;
- //Widget* tab[7];
- Widget **tab = new Widget*[7];
- // Niby to to samo co wyzej, mamy tablice dynamiczna wskaznikow, ALE
- // W pierwszym przypadku wszystkie 7 elementow dostaje juz adres pamieci
- // W drugim przypadku adresy nie sa jeszcze przypisane, dlatego gdybysmy
- // uzyli pierwszego sposobu na inicjalizacje tablicy, dodali np 2 elementy pod [0] i [1]
- // i w petli od 0 do 7 zrobili: tab[i]->wypisz() to program moze cos odwalic
- // dlatego ze tablica jeszcze nie ma adresow i probujesz na nieistniejacym adresie
- // wywolac metode "wypisz()"
- // Odkomentuj ponizszy kod i sprawdz jakie wypisze adresy
- // Potem zakomentuj moja inicjalizacje tablicy Widget i odkomentuj Twoja i zas sprawdz
- // W przypadku mojego sposobu niewpisane do tablicy elementy beda wypisane jako ZERO,
- // ale rzeczywiscie beda NULLAMI
- // Potem jest zadanie ze trzeba wypisac wszystkie elementy i przy mojej inicjalizacji
- // bedziesz mogla sprawdzic czy adres jest nullem, jesli nie to mozesz wypisac na ekran
- // i nic sie nie wydupi
- /* cout << "ADRESY" << endl;
- tab[0] = new Widget("a"); // Tworzymy sobie jeden obiekt zeby byl w tablicy;
- for(int i = 0; i < 7; i++) {
- cout << tab[i] << endl ;
- }
- cout << "KONIEC ADRESOW" << endl << endl;
- */
- cout << "Wstawianie --- " << endl;
- tab[0] = &widget;
- tab[1] = &textBox;
- tab[2] = &slider;
- for(int i = 0; i < 7; i++) {
- // tu jest to sprawdzenie, jak zostawisz twoja inicjalizacje tablicy to cos sie popierdoli
- if (tab[i] != NULL) {
- tab[i]->wypisz();
- cout << endl;
- }
- }
- // metody wypisz() uzyte w petli to implementacja metody z klasy Widget, dlatego nie wypisuje ona np tekstu z klasy TextBox ktora jest nadpisana zeby dodawala cos wiecej
- cout << "Program end" << endl;
- // ZAD 4
- // Konstruktory wywoluja sie od najstarszego do najmlodszego, czyli od najwyzszej klasy bazowej, u nas Widget, do najnizszej, PasswordTextBox
- // Destruktory na odwrot, najpierw usunie sie PasswordTextBox, potem TextBox potem Widget
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement