#include<iostream>
#include<vector>
struct IObject
{
virtual ~IObject(){}
virtual IObject* Clone()=0;
virtual void Work()=0;
};
struct Concrete_Object1: IObject
{
Concrete_Object1(){ std::cout<<"Concrete_Object1: was build\n"; }
Concrete_Object1(const Concrete_Object1& rhs) { std::cout<<"Concrete_Object1: was build by copy\n"; }
virtual void Work() { std::cout<<"Concrete_Object1: working\n"; }
virtual ~Concrete_Object1() { std::cout<<"Concrete_Object1: destroyed\n"; }
virtual Concrete_Object1* Clone() { return new Concrete_Object1(*this); }
};
struct Concrete_Object2: IObject
{
Concrete_Object2(){ std::cout<<"Concrete_Object2: was build\n"; }
Concrete_Object2(const Concrete_Object2& rhs) { std::cout<<"Concrete_Object2: was build by copy\n"; }
virtual void Work() { std::cout<<"Concrete_Object2: working\n"; }
virtual ~Concrete_Object2() { std::cout<<"Concrete_Object2: destroyed\n"; }
virtual Concrete_Object2* Clone() { return new Concrete_Object2(*this); }
};
struct Manager
{
~Manager()
{
const size_t size = mObj.size();
for(size_t n=0;n<size;++n){ delete mObj[n]; mObj[n] = 0l; }
}
void Connect(IObject* src){ mObj.push_back( src->Clone() ); }
void Work()
{
const size_t size = mObj.size();
for(size_t n=0;n<size;++n){ mObj[n]->Work(); }
}
std::vector<IObject*> mObj;
};
int main()
{
Manager man;
IObject* agent1 = new Concrete_Object1();
IObject* agent2 = new Concrete_Object2();
man.Connect(agent1);
man.Connect(agent2);
delete agent1;
delete agent2;
man.Work();
return 0;
}