Dziedziczenie klasa widget

0

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


0

Ale z czym nie możesz sobie poradzić?
Przeanalizuj sobie następującą rzecz ( dokładnie to o czym mowa w zadaniu ):

TComponent ( Component == Twój Widget ) - tutaj jedynie jest więcej poziomów dziedziczenia ( w sumie możesz przyjąć, że Twój Widget to TWinControl )

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Classes_TComponent.html
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/StdCtrls_TButton.html
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/StdCtrls_TEdit.html

W Twoim kodzie w klasach Edit oraz Button brakuje metod i pól charakterystycznych dla tego typu "widgetów'. Button powinien mieć jakieś cechy przycisku np. możliwość wywołania zdarzenia onClick a Edit np. ograniczenie długości znaków lub ilość linii itp.. Choć nie jest to napisane wprost to chyba te to cel zadania jest taki żeby w destruktorach wyraźnie zaznaczyć, że zwalnia się ewentualne zasoby alokowane przez klasę potomną dla Widgeta. No i oczywiście konstruktor/destruktor musi wywoływać odpowiednią metodę inherit/parent (obiektu rodzica).

1 użytkowników online, w tym zalogowanych: 0, gości: 1