С++ HELP! создать указатель на функцию член класса!
а что будет делать метод, который не знает свой this?
вообще, топик поднимается где-то раз в год в этои разделе
вообще, топик поднимается где-то раз в год в этои разделе
Можно указать ей this при вызове. 

вообще, топик поднимается где-то раз в год в этои разделеда, примерно так и есть.

Люди вы видно с ВМК! Объясните плиз на уровне слегка продвинутых чайников с физ-фака!
class AClass {
public:
double AFunc {
return 1;
}
};
int main {
double (AClass::* a_method;
a_method = &AClass::AFunc;
AClass an_object;
double result = (an_object.*a_method;
}class AClass {
public:
double AFunc {
return 1;
}
double aaa {
double (AClass::* a_method;
a_method = &AClass::AFunc;
// Дополни код плиз
// Здесь нужно передать указатель на ф. AFunc библиотечной процедуре, причем так
// что бы она имела тим double(*) а не double (AClass::*)
}
};
int main {
double (AClass::* a_method;
a_method = &AClass::AFunc;
AClass an_object;
double result = (an_object.*a_method;
}
public:
double AFunc {
return 1;
}
double aaa {
double (AClass::* a_method;
a_method = &AClass::AFunc;
// Дополни код плиз
// Здесь нужно передать указатель на ф. AFunc библиотечной процедуре, причем так
// что бы она имела тим double(*) а не double (AClass::*)
}
};
int main {
double (AClass::* a_method;
a_method = &AClass::AFunc;
AClass an_object;
double result = (an_object.*a_method;
}
// Дополни код плиз
// Здесь нужно передать указатель на ф. AFunc библиотечной процедуре, причем так
// что бы она имела тим double(*) а не double (AClass::*)
#include <boost/bind.hpp>
...
boost::bind(&AClass::a_method, &an_object);
Впрочем, это не то что тебе подойдёт...
Это неразрешимая проблемма?Задача в принципе разрешима.
Но проще сделать глобальную или статическую функцию. Идея примерно такая:
#include <iostream>
using namespace std;
double callback(double(*pf
{
return pf;
}
template<class t, int count = 0>
class invoker
{
public:
invoker(t& rc, double (t::*pf : m_rc(rc m_pf(pf)
{
*get_ppc = this;
}
typedef double(*tfunc;
operator tfunc
{
return handler;
}
private:
t& m_rc;
double (t::*m_pf;
invoker(const invoker& ri) : m_rc(ri.m_rc) { }
void operator=(const invoker&) { }
static double handler
{
invoker<t, count>* pc = *get_ppc;
return (pc->m_rc.*pc->m_pf;
}
static invoker<t, count>** get_ppc
{
static invoker<t, count>* pc = NULL;
return &pc;
}
};
#define INPLACE_INVOKER(CLASS_T, CLASS_R, FUNC_P) \
invoker<CLASS_T, __COUNTER__>(CLASS_R, FUNC_P)
class c
{
public:
c : m_f(1.1) { }
double f { return m_f += m_f; }
private:
double m_f;
};
void main
{
c _c;
cout << callback(INPLACE_INVOKER(c, _c, &c::f << endl;
cout << callback(INPLACE_INVOKER(c, _c, &c::f << endl;
cout << callback(INPLACE_INVOKER(c, _c, &c::f << endl;
cin.get;
}
твоя библиотека просит указатель на функцию.
поэтому ты туда можешь передать либо указатель на глобальную функцию, либо указатель на статический метод класса.
поэтому ты туда можешь передать либо указатель на глобальную функцию, либо указатель на статический метод класса.
А еще можно воспользоваться std::mem_fun
А еще можно воспользоваться std::mem_funКак это?
неправильно
Конечно ты не получишь прямой указатель на функцию, но получишь объект, который ведет себя как указатель на функцию. Вот пример из MSDN:
// functional_mem_fun.cpp
// compile with: /EHsc
#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>
using namespace std;
class StoreVals
{
int val;
public:
StoreVals { val = 0; }
StoreVals(int j) { val = j; }
bool display { cout << val << " "; return true; }
int squareval { val *= val; return val; }
int lessconst(int k) {val -= k; return val; }
};
int main( )
{
vector<StoreVals *> v1;
StoreVals sv1(5);
v1.push_back(&sv1);
StoreVals sv2(10);
v1.push_back(&sv2);
StoreVals sv3(15);
v1.push_back(&sv3);
StoreVals sv4(20);
v1.push_back(&sv4);
StoreVals sv5(25);
v1.push_back(&sv5);
cout << "The original values stored are: " ;
for_each(v1.begin v1.end mem_fun<bool, StoreVals>(&StoreVals::display;
cout << endl;
// Use of mem_fun calling member function through a pointer
// square each value in the vector using squareval
for_each(v1.begin v1.end mem_fun<int, StoreVals>(&StoreVals::squareval;
cout << "The squared values are: " ;
for_each(v1.begin v1.end mem_fun<bool, StoreVals>(&StoreVals::display;
cout << endl;
// Use of mem_fun1 calling member function through a pointer
// subtract 5 from each value in the vector using lessconst
for_each(v1.begin v1.end
bind2nd (mem_fun1<int, StoreVals,int>(&StoreVals::lessconst 5;
cout << "The squared values less 5 are: " ;
for_each(v1.begin v1.end mem_fun<bool, StoreVals>(&StoreVals::display;
cout << endl;
}
По-моему, mem_fun гораздо удобнее пользовать чем указатели на функции-члены т.к. не надо писать непонятные выражения типа Result (Type::* _Pm Arg )
По-моему, mem_fun гораздо удобнее пользовать чем указатели на функции-члены т.к. не надо писать непонятные выражения типа Result (Type::* _Pm Arg )Ты не понимаешь. У человека может быть сторонняя библиотека, которая хочет определённый тип функции. Я тоже сначала предложил boost::bind (что предпочтительнее std::mem_fun но потом подумал и написал, что это решение не подходит автору. Решение, которое может подойти, я привёл выше по теме. Почитай ветку внимательно.
Про стороннюю библиотеку от автора ничего не было сказано.
Я предложил автору решение, которое мне нравится, а он пусть сам решает, какое решение ему подходит.
Я предложил автору решение, которое мне нравится, а он пусть сам решает, какое решение ему подходит.
Про стороннюю библиотеку от автора ничего не было сказано.Внимательно читаем:
Здесь нужно передать указатель на ф. AFunc библиотечной процедуре, причем так
Пардон, не увидел
Оставить комментарий
makadi
Как в С++ создать указатель на функцию которая явл. членом класса.Пробовали
...
double MyClass::My_func (void)
....
a = &MyClass::My_func;
...
При это получили
Can't coinvert double (MyClass::*void) to double(*) (void) in assignment