С++ HELP! создать указатель на функцию член класса!
вообще, топик поднимается где-то раз в год в этои разделе
Можно указать ей 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;
}
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Как это?
неправильно
// 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