W poniższej implementacji wzorca projektowego kompozyt
- Compoment odpowiada dowolnemu elementowi w hierarchii zaś
- Composite agreguje elementy typu Compoment.
https://pl.wikipedia.org/wiki/Kompozyt_(wzorzec_projektowy)

Zadanie:
1. W istniejącej implementacji w strukurze jako elementy wstawiane są obiekty typu Component.
Należy klasę Compoment uczynić klasą wirtualną a jako element wstawiany należy zaproponować inny typ dodając go do hierarchii.
2. Proszę zwrócić uwagę na to w jakiej kolejności niszczone są poszczególne obiekty wypisując odpowiednią informację na ekranie.
Co można powiedzieć o tym w jaki sposób obiekty są niszczone ?
3. Należy napisać metodę pozwalającą na wyszukiwanie w danej strukturze elementu o zadanej nazwie.
(Co w przypadku gdyby było ich więcej niż 1)


#include
#include
#include

class Component
{
std::string name_;

protected:
constexpr static const char* indentation_increment = " ";

public:
virtual void display(std::string indentation)
{
std::cout << indentation << "--" << name_ << std::endl;
}

Component(const std::string& name) : name_(name) {}
};

class Composite : public Component
{
std::vector> components_;

public:
virtual void display(std::string indentation) override
{
Component::display(indentation);
for (auto& c : components_)
c->display(indentation + indentation_increment);
}

public:
Composite(const std::string& name) : Component(name) {}

void addComponent(const std::shared_ptr& c)
{
components_.push_back(c);
}
};

int main(void)
{
auto L1A = std::make_shared("dir 1");
L1A->addComponent(std::make_shared("file 1"));
L1A->addComponent(std::make_shared("file 2"));
L1A->addComponent(std::make_shared("file 3"));

auto L1B = std::make_shared("dir 2");
L1B->addComponent(std::make_shared("file 4"));

auto L1C = std::make_shared("dir 3");

auto L2A = std::make_shared("dir 4");
L2A->addComponent(L1A);
L2A->addComponent(L1B);
L2A->addComponent(L1C);
L2A->addComponent(std::make_shared("file 5"));

L2A->display("");

return 0;
}