Класс B имеет функцию обратного вызова B::callback(), которая генерирует данные, которые должны быть дополнительно обработаны C::foo() и, наконец, D::foo().< /p>
Код: Выделить всё
class A{
public:
void f(){
B.run();
//C.run();
//D.run();
}
private:
B b;
C c;
D d;
};
Код: Выделить всё
class B{
public:
void run(){
set_process(callback,void* arg); // external_lib::set_process
}
void callback(){
data = get_data();
}
private:
float *data;
};
Код: Выделить всё
class C{
public:
void foo(float *data){
// process data
}
};
Код: Выделить всё
class D{
public:
void foo(float *data){
// final process data
}
};
Как следует спроектировать поток данных, чтобы данные могли обмениваться данными между B, C и D?
Мое нынешнее решение является наивным:
Определив статическую функцию, не являющуюся членом, void helper(), которая вызванный внутри B::callback(), я могу вызвать C::foo() и D::foo(), используя указатели на функции-члены следующим образом:
Код: Выделить всё
void helper(float* data,void* args){
static_cast(args)->foo(data);
static_cast(args)->foo(data);
}
class A{
//...
};
Код: Выделить всё
void B::callback(){
data = get_data();
void *args = nullptr;
helper(data,args);
}
Код: Выделить всё
A::helper()
Редактировать 1[/b]
Спасибо за ваши комментарии.
Только для протокола , решение, которое сработало для меня, — создать функцию-член в A::share_data, которая передает данные в C::foo и D::foo, и передать их в B< /code> путем создания установщика, использующего std::function и std::bind. Таким образом, B может вызвать функцию-член A, которая передает данные остальным объектам-членам.
Спасибо @Peter
Для полноты я привожу минимальный пример. Дайте мне знать, что вы думаете.
Код: Выделить всё
class A{
public:
void f(){
b.set_caller(std::bind(&A::share_data,this,std::placeholders _1));
B.run();
//C.run();
//D.run();
}
void share_data(float *data){
c.foo(data);
d.foo(data);
{
private:
B b;
C c;
D d;
};
Код: Выделить всё
class B{
public:
void run(){
set_process(callback,void* arg); // external_lib::set_process
}
void callback(){
data = get_data();
_share_data(data);
}
void set_caller(std::function A_member_f){
_share_data=A_member_f;
}
private:
float *data;
void _share_data(float*);
};
Подробнее здесь: https://stackoverflow.com/questions/785 ... nt-classes