powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатель на функцию из класса
7 сообщений из 7, страница 1 из 1
Указатель на функцию из класса
    #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
Указатель на функцию из класса
    #39696030
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Suzeren,

Если коротко, то никак, даже через лямбды .
Если TDetermination это синглтон, то можно его в коллбэк функции получить обычным путём. Ну а если нет, то придётся тебе заводить глобальный стейт
и получать к нему доступ в функции, что, конечно же, является очень плохим стилем программирования, но сишники такое любят.
...
Рейтинг: 0 / 0
Указатель на функцию из класса
    #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
Указатель на функцию из класса
    #39696128
Suzeren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно. Ну, я ожидал такого ответа. Правда надеялся, что "а вдруг есть какой-то изуверский, запрещенный религией, но красивый способ" :-) В итоге написал как завещали деды - программу без всяких классов. Не стал выпендриваться, что уж тут.
...
Рейтинг: 0 / 0
Указатель на функцию из класса
    #39696130
Suzeren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum, static мне не подходит, потому что функция Ahead помимо прочего работает с членами класса TDetermination.
...
Рейтинг: 0 / 0
Указатель на функцию из класса
    #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
Указатель на функцию из класса
    #39696188
Suzeren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum, а, увидел. Спасибо.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатель на функцию из класса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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