#include <iostream>
#include <vector>
#include <memory>
using namespace std;

//************* Definitions
class OtherClass;

class Command {
public: 
    virtual void execute() = 0; 
    virtual ~Command();
}; 
class CommandOtherClass : public Command { 
    OtherClass *target; 
    void (OtherClass::*f)(); 
public: 
    CommandOtherClass (void (OtherClass::*fct)(), OtherClass*t); 
    void execute() override; 
};
class CommandAdHoc : public Command { 
public: 
    void execute() override; 
};
class SomeClass {
public:
    static std::vector<unique_ptr<Command>> UpdateFuncs;
    static void executeAll();
};

class OtherClass{
private:
    void Update();
public:
    OtherClass();
};

//*************** Implementation

std::vector<unique_ptr<Command>> SomeClass::UpdateFuncs;
Command::~Command() {}
CommandOtherClass::CommandOtherClass (void (OtherClass::*fct)(), OtherClass*t) 
    :  f(fct),target(t)
{
} 
void CommandOtherClass::execute() {
	(target->*f)();
}
void CommandAdHoc::execute() {
	cout<<"Taht's all folks :-) !"<<endl;
}

void SomeClass::executeAll() {
    for (auto &x:UpdateFuncs) 
        x->execute(); 
}
OtherClass::OtherClass() {
    SomeClass::UpdateFuncs.push_back(make_unique<CommandOtherClass>(&OtherClass::Update, this));
}
void OtherClass::Update() {
    cout << "Hello, world, said by "<<this<<endl;
}

int main() {
    OtherClass a,b; 
    SomeClass::UpdateFuncs.push_back(make_unique<CommandAdHoc>());
   
    SomeClass::executeAll(); 
    return 0;
}