Есть 2 объекта - A и B, наслдеованные от одного интерфейса. Объект A хранит некоторые данные которые запрашивает B. То, чего удалось достичь - B запрашивает данные и получает их, вот только как видно по коду это обмен строками, необходимо чтоб тип данных заранее был неизвестен. Понимаю что для этого методы интерфейса GetMessage и SendMessage должны быть шаблонными, но одновременно шаблонными и виртуальными они быть не могут.
#include <iostream>
#include <vector>
using namespace std;
class BaseClass;
//=========================================
class Mediator{
public:
void addObj(BaseClass *obj){
this->objList.push_back(obj);
}
BaseClass* getObj(int index){
return objList[index];
}
template<typename T>
void Redirect(T message, BaseClass *sender){
sender->GetMessage(message);
}
private:
vector<BaseClass*> objList;
};
//=========================================
class BaseClass {
public:
Mediator *mediator;
virtual void SendMessage(string action) = 0;
virtual void GetMessage(string action) = 0;
};
//=========================================
class B : public BaseClass{
public:
B(Mediator *mediator){
this->mediator = mediator;
this->mediator->addObj(this);
}
void SendMessage(string action) override{
this->mediator->Redirect(action,this->mediator->getObj(0));
}
void GetMessage(string action) override{
cout << "I'm B - " << action << endl;
}
};
//=========================================
class A : public BaseClass{
public:
string getX(){return this->x;}
A(){
this->mediator = new Mediator();
this->mediator->addObj(this);
}
void SendMessage(string action) override{
this->mediator->Redirect(action,this->mediator->getObj(1));
}
void GetMessage(string action) override{
if(action == "getX"){
this->SendMessage(getX());
}
}
private:
string x = "5";
};
int main()
{
A *a = new A();
B *b = new B(a->mediator);
b->SendMessage("getX");
return 0;
}