Как эффективно обмениваться данными между методами разных классов?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как эффективно обмениваться данными между методами разных классов?

Сообщение Anonymous »

Предположим, существует класс A, инкапсулирующий классы B, C и D.
Класс 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);
}
.. однако, поскольку я разрабатываю приложение реального времени, я ищу решение для оптимизации. И проблема с этим подходом заключается в том, что при приведении создаются копии как B, так и C, поэтому мне было интересно, можно ли сделать helper() функцией-членом A (

Код: Выделить всё

A::helper()
) и передав его B с помощью указателя на функцию, я мог бы, по крайней мере, привести ссылки на c и d, однако это еще больше усложняет ситуацию.
Редактировать 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»