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

dziedziczenie klasa widget

0 głosów
118 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ź 107 wizyt
0 głosów
1 odpowiedź 60 wizyt
pytanie zadane 30 kwietnia 2021 w C# przez Adamek185wp Obywatel (1,280 p.)

87,942 zapytań

136,520 odpowiedzi

304,383 komentarzy

58,306 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...