#include <iostream>
#include <list>
#include <memory>
class Component {
public:
virtual void show() const = 0;
virtual void add(const std::shared_ptr<Component> c) {};
};
class Leaf : public Component {
public:
void show() const override { std::cout << "In leaf show()." << std::endl; }
};
class Composite : public Component {
public:
void show() const override {
std::cout << "In Composite show()." << std::endl;
for (const auto& c : lc) {
c->show();
}
}
void add(const std::shared_ptr<Component> c) override { lc.push_back(c); }
private:
std::list<std::shared_ptr<Component>> lc;
};
int main(int argc, char *argv[]) {
std::unique_ptr<Component> t = std::make_unique<Composite>();
std::shared_ptr<Component> l1 = std::make_shared<Composite>();
std::shared_ptr<Component> l2 = std::make_shared<Leaf>();
l1->add(l2);
t->add(l1);
t->add(l2);
t->show();
return 1;
}