• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

dziedziczenie klasa widget

Object Storage Arubacloud
0 głosów
204 wizyt
pytanie zadane 9 maja 2020 w C i C++ przez demon1234 Nowicjusz (160 p.)

Witam mam takie zadanie niestety nie mogę sobie z nim poradzić

Widgety to graficzne elementy interfejsu użytkownika, jak przyciski, suwaki, czy wyświetlacze. Są one
często implementowane jako klasy wywiedzione z jednej klasy bazowej reprezentującej pusty widget.
Skomplikowane widgety składają się z innych, na przykład edytor tekstu składa się z pola tekstowego
oraz pionowego i poziomego suwaka. Całe okienko aplikacji również jest widgetem zawierającym wiele
mniejszych kontrolek. Składowe dużego widgetu nazywamy jego dziećmi zaś sam ten widget nazywamy
ich rodzicem. Graficzny układ widgetów opisany jest więc przez wielopoziomowe drzewo zawierania się
jednych widgetów w innych. Korzeniem tego drzewa, czyli rodzicem wszystkich widgetów, jest okno aplikacji. Drzewo widgetów jest zaimplementowane jako dynamiczna struktura danych. Widgety są tworzone
dynamicznie, a każdy z nich przechowuje listę wskaźników na swoje dzieci. Destruktor rodzica usuwa z
pamięci wszystkie jego dzieci. Do usunięcia wszystkich widgetów aplikacji wystarczy więc usunięcie głównego okna. Każdy widget posiada unikatową nazwę umożliwiającą jego łatwe wyszukanie wśród wszystkich
kontrolek aplikacji. Napisz klasę Widget reprezentującą widget o zadanej nazwie. Zaimplementuj:

• Konstruktor przyjmujący nazwę widgetu.
• Destruktor usuwający z pamięci wszystkie dzieci widgetu.
• Jedną metodę add, która przyjmuje wskaźnik na dowolny widget i dodaje go jako dziecko widgetu,
na rzecz którego jest wołana.
• Jedną metodę print, która drukuje na standardowe wyjście nazwę widgetu oraz wszystkich jego
dzieci jak w przykładzie poniżej. Dzieci drukowane są w kolejności ich dodawania metodą add.

Z klasy Widget wyprowadź klasy Button oraz Edit reprezentujące odpowiednio przycisk oraz pole tekstowe. W każdej z nich zaimplementuj jedynie konstruktor przyjmujący nazwę widgetu. Wszystkie klasy
powinny być przystosowane do użycia w przykładowym programie poniżej. Klasy korzystają tylko z
plików nagłówkowych iostream, string, oraz vector lub list.
Przykładowy program

int main() {
Button yes = new Button("yes");
Button 
no = new Button("no");
Widget panel = new Widget("panel");
panel->add(yes);
panel->add(no);
Edit 
edit = new Edit("edit");
Widget *window = new Widget("window");
window->add(panel);
window->add(edit);
window->print();
delete window; }

Wykonanie
window
window panel
window panel yes
window panel no
window edit

na dany moment mam tyle

#include <iostream>
#include <string>
#include <list>
using namespace std;


class Widget{

public:


    Widget(const string &name ):name(name){};

    void add (Widget *wskaznik ) {

    obiekt.push_back(wskaznik);

    };
    void print(){


       for(Widget* n : obiekt)
        std::cout << n->name << ' ';
        }

  //  ~Widget();


private:
    string name;
    list<Widget*> obiekt;




};

class Button : public Widget{

public:
    Button(const string &name) :Widget(name) {};


};

class Edit : public Widget{

public:
    Edit(const string &name) :Widget(name) {};

};


int main()
{
Button *yes = new Button("yes");
Button *no = new Button("no");
Widget *panel = new Widget("panel");
panel->add(yes);
panel->add(no);
Edit *edit = new Edit("edit");
Widget *window = new Widget("window");
window->add(panel);
window->add(edit);
window->print();
delete window;
}

 

komentarz 9 maja 2020 przez DragonCoder Nałogowiec (36,500 p.)
a w czym jets problem? Bo napisales polecnie, pokazales swoj kod i tyle
komentarz 9 maja 2020 przez DragonCoder Nałogowiec (36,500 p.)

@demon1234, Ogolnie dodajac do panel 2x button, zamujesz w vvektorze/liscie 2 miejsca. Pozniej ten obiekt dodajesz do windows, wiec teoretycznie w obiekcie window masz vector of vector. Wiec powinnienes czytac moim zdaniem to tak jak w tabeli. Probowalem teraz sam zrobic cos podobnego:

/*inline void print () {
    int cap;
    for (int i = 0; i < object.size(); i ++) {
        cap = object[i]->object.size();
        std::cout << object[i]->name;
        for (int j = 0; j < cap - 1; j++) {
            object[i][j].print();
        }
    }
}*/
inline void print () {
    for (Widget *w : object) {
        for (Widget *k : w) {
            k->print();
        }
    }
}

teooretycznie obiekty sie wypisuja w pierwszym przypadku, z uzyciem skroconej petli for, wgl nie chce sie skompilowac, nie do konca rozumiem czemu, ale pozniej jeszcze na to popatrze. Ten przyklad wyzej tzn funkcja print powinna dzialac

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 557 wizyt
0 głosów
1 odpowiedź 221 wizyt
pytanie zadane 30 kwietnia 2021 w C# przez Adamek185wp Obywatel (1,280 p.)

92,536 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...