Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатель на функцию из класса / 7 сообщений из 7, страница 1 из 1
31.08.2018, 09:45
    #39695980
Suzeren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на функцию из класса
В общем, можете кидать камнями. Что-то не втыкаю в пятницу с утра... как сделать чтобы работало знаю, но для того придется отказать от классов. А этого не хочется. В общем суть такая. Есть класс вида:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class TDetermination // класс для данных определителя тяги
{
  private:
    double  mu;
    double  t0, tend, tstep, day;

  public:
    void Estim ( double *t, double *r_j2k, int n, SOLVE *ss, FVEC *p, ofstream *out11);
    void Ahead ( double *x, double *y );
};



Есть отдельная функция, вне класса, в библиотеке стандартного набора:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void deriv ( double *x, int nx, double *dx, int ny,
                    void a( double *, double * ), double *B )
{
      **************** какой-то код
        a(x,y1);
      ***************** какой-то код
        a(x,y2);

}



Как видим, она принимает на вход указатель на функцию a.

А теперь хочется... сделать вот так

Код: plaintext
1.
2.
3.
4.
  void TDetermination::Estim ( double *t, double *r_j2k, int n, SOLVE *ss, FVEC *p, ofstream *out11)
  {
      deriv(xmeas, int nx, dx, ny, Ahead, B ); // и вот тут горе - я не могу передать указатель на функцию член класса в функцию, которая не член этого класса
  }




Какие идеи? Главное, что с функцией deriv делать ничего нельзя )) Она входит в состав модуля стандартных функций, с которой работают овер 20 других программ ))
...
Рейтинг: 0 / 0
31.08.2018, 10:56
    #39696030
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на функцию из класса
Suzeren,

Если коротко, то никак, даже через лямбды .
Если TDetermination это синглтон, то можно его в коллбэк функции получить обычным путём. Ну а если нет, то придётся тебе заводить глобальный стейт
и получать к нему доступ в функции, что, конечно же, является очень плохим стилем программирования, но сишники такое любят.
...
Рейтинг: 0 / 0
31.08.2018, 12:08
    #39696127
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на функцию из класса
SuzerenКакие идеи?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
class TDetermination // класс для данных определителя тяги
{
  private:
    double  mu;
    double  t0, tend, tstep, day;

  public:
    void Estim ( double *t, double *r_j2k, int n, SOLVE *ss, FVEC *p, ofstream *out11);
    void Ahead ( double *x, double *y );
    
public:
	static void s_Ahead(double *x, double *y, void* pvContext);
};

void deriv ( double *x, int nx, double *dx, int ny,  void a( double *, double *, void* pvContext ), double *B, void* pvContext )
{
      **************** какой-то код
        a(x,y1);
      ***************** какой-то код
        a(x,y2);

}

void TDetermination::s_Ahead(double *x, double *y, void* pvContext);
{
	static_cast<TDetermination*>(pvContext)->Ahead(x, y);
}

void TDetermination::Estim ( double *t, double *r_j2k, int n, SOLVE *ss, FVEC *p, ofstream *out11)
{
	// тут не понятно с какими параметрами Ahead вызывается из deriv, поэтому сложно сказать как правильно вызвать
	// s_Ahead, но скорее всего придется добавить в deriv параметр void* pvContext и отсюда передавать его как this
	deriv(xmeas, int nx, dx, ny, s_Ahead, B, this );
}



если интерфейс функции deriv изменить нельзя, то можно вместо одного из указателей void a( double *, double *) передавать структуру вида

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
typedef _struct _AHEADCONTEXT
{
	double* y;
	void*	context;
} AHEADCONTEXT, *LPAHEADCONTEXT;

void TDetermination::s_Ahead(double *x, double *y);
{
	auto pvAheadContext = reinterpret_cast<LPAHEADCONTEXT>(y);
	static_cast<TDetermination*>(pvAheadContext->context)->Ahead(x, pvAheadContext->y);
}


структуру готовим заранее и передаем указатель на нее в качестве завуалированного указателя на double в deriv
...
Рейтинг: 0 / 0
31.08.2018, 12:08
    #39696128
Suzeren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на функцию из класса
Понятно. Ну, я ожидал такого ответа. Правда надеялся, что "а вдруг есть какой-то изуверский, запрещенный религией, но красивый способ" :-) В итоге написал как завещали деды - программу без всяких классов. Не стал выпендриваться, что уж тут.
...
Рейтинг: 0 / 0
31.08.2018, 12:10
    #39696130
Suzeren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на функцию из класса
Cerebrum, static мне не подходит, потому что функция Ahead помимо прочего работает с членами класса TDetermination.
...
Рейтинг: 0 / 0
31.08.2018, 12:16
    #39696138
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на функцию из класса
SuzerenCerebrum, static мне не подходит, потому что функция Ahead помимо прочего работает с членами класса TDetermination.
так у тебя в внутри s_Ahead идет обращение к нестатичной Ahead благодаря указателю this,

Код: plaintext
1.
static_cast<TDetermination*>(pvAheadContext->context)->Ahead(x, pvAheadContext->y);


который ты передашь. Задача s_Ahead как раз избавиться от static, что она и делает, а дальше в игру вступает не-static функция Ahead, в которой делай все что хочешь
...
Рейтинг: 0 / 0
31.08.2018, 12:53
    #39696188
Suzeren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на функцию из класса
Cerebrum, а, увидел. Спасибо.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатель на функцию из класса / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]