Polymorphism in C++ and printing methods

0

Napisz klase Widget reprezentujaca widget o zadanej nazwie. Zaimplementuj:

  • Konstruktor przyjmujacy nazwe widgetu.
  • Destruktor usuwajacy z pamieci wszystkie dzieci widgetu.
  • Jedna metode add, która przyjmuje wskaznik na dowolny widget i dodaje go do widgetu,
    na rzecz którego jest wołana.
  • Jedna metode print, która drukuje na standardowe wyjscie nazwe widgetu oraz wszystkich jego
    pochodne jak w przykładzie ponizej. Pochodne drukowane sa w kolejnosci ich dodawania metoda add.
    Z klasy Widget wyprowadz klasy Button oraz Edit reprezentujace odpowiednio przycisk oraz pole tekstowe.
    W kazdej z nich zaimplementuj jedynie konstruktor przyjmujacy nazwe widgetu. Wszystkie klasy
    powinny byc przystosowane do uzycia w przykładowym programie ponizej. Klasy korzystaja tylko z
    plików nagłówkowych iostream, string, oraz vector lub list.

Mam problem z metodą add i print, próbuję drukować za pomocą iostream, aleeee czy to aby na pewno jest włąściwy kierunek. Dziękuje za pomoc.

#include <iostream>
#include <string>
#include <vector>
#include <list>

using namespace std;



class Widget
{
    friend ostream &operator <<(ostream &stream, const Widget &widget);
public:
    static Widget *scan(istream &stream);
    Widget(const string &name);

    const string &getName() const;
    
    virtual void add(string c)
    {
        c=name;
    }

    virtual ~Widget() //virtual destructor
private:
    virtual ostream &print(ostream &stream) const;
    string name;
};

class Button: public Widget
{
public:
    Button(const string &name);
 
private:
    virtual ostream &print(ostream &stream) const;

};

class Edit: public Widget
{
public:
    Edit(const string &name);
  
private:
    virtual ostream &print(ostream &stream) const;

};

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

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


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

friend ostream &operator <<(ostream &stream, const Widget &widget)
{
   return widget.print(out); 
}        
 
virtual ostream &print(ostream &out) const
{
    return out;  
}
 
 
string Widget::print() 
{
    return c; 
}    

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


program powinien wyswietlic:

window
window panel
window panel yes
window panel no
window edit

0

Kod zawiera mnóstwo błędów ( np. brak implementacji wirtualnej funkcji add() w klasach potomnych ).
Popraw to tak aby Twój kod przynajmniej dał się skompilować.

0

Chyba źle zrozumiałeś zadanie:

  • Jedna metode add, która przyjmuje wskaznik na dowolny widget i dodaje go do widgetu,
    na rzecz którego jest wołana.
    ...
    Pochodne drukowane sa w kolejnosci ich dodawania metoda add.

Czyli twoje add powinno wyglądać tak:

void add(Widget* widget);
// albo, zależnie od modelu zarządzania pamięcią:
void add(std::unique_ptr<Widget>&& widget);
// albo
void add(std::shared<Widget> widget);

Co do polimorfizmu to lepiej będzie to działać w takiej formie:

class IPrintable {
public:
    virtual ~IPrintable() {}
    virtual std::ostream& print(std::ostream&) const = 0;
};

std::ostream& operator(const IPrintable& w, std::ostream& out)
{
    return w.print(out);
}

class Widget : public IPrintable 
{
public:
    Widget(const std::string& name) : name{name} {}

    void add(std::unique_ptr<Widget>&& child);

public: /* IPrintable */
    // prints description this widget and its children
    std::ostream& print(std::ostream&out) const final {
         printMe(out);
         if (!childs.emty()) {
             out << '(';
             for (const auto& c : childs) c->print(out) << ',';
             out << ") ";
         }
         return out;
    }

private:
    // prints description for this widget only
    std::ostream& printMe(std::ostream&) const;

private:
     std::string name;
     std::vector<std::unique_ptr<Widget>> childs;
};
0

Hmm, wie moze ktos jak poprawnie poprawić kod, ktory napisal/napisala aaAN?

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