Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Указатель на функцию член класса


Автор: BasilL 13.1.2011, 11:41
Всем доброго дня!
Читал подобные темы, но что-то не пойму все равно; раньше не приходилось с таким дел иметь.

Допустим имеется класс
Код

class MyClass{
public:
private:
  double MyFunc(double x, double y);
void calc();
}

doble MyClass::MyFunc(double x, double y)
{
  double f = 0;
  // что-то считаем
  return f;
}

void MyClass::calc()
{
  double a,b, result, error;
  gsl_function F;
  F.function = &MyFunc; // проблема тут, так неверно, я знаю. А как надо не могу сообразить
  gsl_integration(&F, a, b, 0, 1e-7, 1000, w, &result, &error);
}


Можно использовать static для этой функции, но очень не хотелось бы, т.к. в расчете ей потребуются ряд элементов и методов класса.

Автор: mes 13.1.2011, 14:48
Цитата(BasilL @  13.1.2011,  10:41 Найти цитируемый пост)
gsl_function

ну так может стоило показать, что это такое ? или форумчанам нужно самим лезть в справочник ?  smile

Добавлено через 2 минуты
если у той функции есть void* для передачи контекста, то для простоты решения, делайте статическую функцию-адаптер, в которой будете вызывате метод, кастя воид* к указателю на Ваш класс.. 

Автор: Cheloveck 13.1.2011, 15:08
BasilL
Цитата

Data Type: gsl_function
    This data type defines a general function with parameters.

    double (* function) (double x, void * params)
        this function should return the value f(x,params) for argument x and parameters params 
    void * params
        a pointer to the parameters of the function 

Если я правильно нашёл, то тут без колдовства не обойтись. Переменная является просто указателем на функцию, указатель на метод туда не проканает. Можно попробовать капнуть в сторону boost.bind.

http://www.network-theory.co.uk/docs/gslref/Providingthefunctiontosolve.html

Автор: mes 13.1.2011, 15:28
Цитата(Cheloveck @  13.1.2011,  14:08 Найти цитируемый пост)
 boost.bind.

хм.. а как ?  smile

Добавлено через 6 минут и 4 секунды
http://liveworkspace.org/code/f3ee5f16c898d92b8b005f46d06d1339

Автор: Cheloveck 13.1.2011, 16:29
Цитата(mes @  13.1.2011,  15:28 Найти цитируемый пост)
хм.. а как ?

Кабы знал как, то и написал бы =) В бинде SQLite под плюсы колбеки обёрнуты в методы именно boost.bind. Руки не дошли просмотреть подробности.

Автор: mes 13.1.2011, 17:16
Цитата(Cheloveck @  13.1.2011,  15:29 Найти цитируемый пост)
В бинде SQLite под плюсы колбеки обёрнуты в методы именно boost.bind. 

тут выбран иной подход.. правда менее (типо-)безопасный.. посредством closure struct  gsl_function.. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)