#include <string>
#include <iostream>
#include <memory>
#include <cstdio>
#include <vector>
#define counted_ptr std::shared_ptr
namespace OOP {
class BaseClass
{
public:
std::string name;
BaseClass(std::string arg) {name=arg;}
friend std::ostream & operator<<(std::ostream &os, const BaseClass& ref)
{
os << ref.name << "\n"; //gives ! ???
return os;
}
};
class array
{
public:
std::vector <counted_ptr<OOP::BaseClass> > myvec;
void push_back( OOP::BaseClass *arg)
{
counted_ptr< OOP::BaseClass> tmp(arg);
myvec.push_back(tmp);
myvec.push_back(tmp);
}
};
void print_tab_el(array arr)
{
std::vector <counted_ptr<OOP::BaseClass> >::iterator it;
for (it=arr.myvec.begin();it!=arr.myvec.end();++it){
std::cout<<**it;
}
}
};
int main()
{
OOP::array tab;
for(int i = 0; i < rand()%10 + 1; ++i)
{
tab.push_back(new OOP::BaseClass("OOP::BaseClass 1"));
tab.push_back(new OOP::BaseClass("OOP::BaseClass 2"));
tab.push_back(new OOP::BaseClass("OOP::BaseClass 3"));
}
OOP::print_tab_el(tab); //prints tab using operator<< for its elements.
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8dmVjdG9yPiAgCgojZGVmaW5lIGNvdW50ZWRfcHRyIHN0ZDo6c2hhcmVkX3B0cgoKbmFtZXNwYWNlIE9PUCB7CgogICAgY2xhc3MgQmFzZUNsYXNzCiAgICAgICAgewogICAgICAgICAgICBwdWJsaWM6ICAKICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CgogICAgICAgICAgICAgICAgQmFzZUNsYXNzKHN0ZDo6c3RyaW5nIGFyZykge25hbWU9YXJnO30KCiAgICAgICAgICAgICAgICBmcmllbmQgc3RkOjpvc3RyZWFtICYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBCYXNlQ2xhc3MmIHJlZikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8IHJlZi5uYW1lIDw8ICJcbiI7IC8vZ2l2ZXMgISA/Pz8KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9zOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgfTsKCgoKICAgIGNsYXNzIGFycmF5CiAgICAgICAgewogICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvciA8Y291bnRlZF9wdHI8T09QOjpCYXNlQ2xhc3M+ID4gbXl2ZWM7CgogICAgICAgICAgICAgICAgdm9pZCBwdXNoX2JhY2soIE9PUDo6QmFzZUNsYXNzICphcmcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZWRfcHRyPCBPT1A6OkJhc2VDbGFzcz4gdG1wKGFyZyk7CiAgICAgICAgICAgICAgICAgICAgICAgbXl2ZWMucHVzaF9iYWNrKHRtcCk7CiAgICAgICAgICAgICAgICAgICAgICAgbXl2ZWMucHVzaF9iYWNrKHRtcCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICB9OwoKCgogICAgdm9pZCBwcmludF90YWJfZWwoYXJyYXkgYXJyKSAKICAgICAgICAgewoKICAgICAgICAgICAgc3RkOjp2ZWN0b3IgPGNvdW50ZWRfcHRyPE9PUDo6QmFzZUNsYXNzPiA+OjppdGVyYXRvciBpdDsKCiAgICAgICAgICAgIGZvciAoaXQ9YXJyLm15dmVjLmJlZ2luKCk7aXQhPWFyci5teXZlYy5lbmQoKTsrK2l0KXsKICAgICAgICAgICAgICAgICBzdGQ6OmNvdXQ8PCoqaXQ7CiAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgfQoKfTsKCmludCBtYWluKCkKewogIE9PUDo6YXJyYXkgdGFiOwoKICBmb3IoaW50IGkgPSAwOyBpIDwgcmFuZCgpJTEwICsgMTsgKytpKQogIHsKICAgIHRhYi5wdXNoX2JhY2sobmV3IE9PUDo6QmFzZUNsYXNzKCJPT1A6OkJhc2VDbGFzcyAxIikpOwogICAgdGFiLnB1c2hfYmFjayhuZXcgT09QOjpCYXNlQ2xhc3MoIk9PUDo6QmFzZUNsYXNzIDIiKSk7CiAgICB0YWIucHVzaF9iYWNrKG5ldyBPT1A6OkJhc2VDbGFzcygiT09QOjpCYXNlQ2xhc3MgMyIpKTsKICB9CiAgIAogIE9PUDo6cHJpbnRfdGFiX2VsKHRhYik7IC8vcHJpbnRzIHRhYiB1c2luZyBvcGVyYXRvcjw8IGZvciBpdHMgZWxlbWVudHMuCn0K