Указатель функции-члена на указатель функции?

Возможный дубликат:
Указатель приведения к функция-член на обычный указатель

есть некоторые коды

class TT {
public:
  void set();
  void par1(int, int);
  void par2(double, double);
};

typedef void(*Ptr1)(TT &, int, int);

typedef void(*Ptr2)(TT &, double, double);

void hello(Ptr1, Ptr2){...}

void TT::set()
{
  hello(&TT::par1, &TT::par2);
}

и ошибка показывает:

error C2664: 'hello' : cannot convert parameter 1 from 'void (__thiscall TT::* )(int,int)' to 'Ptr1'

подскажите пожалуйста как решить эту проблему?


person user1855182    schedule 27.11.2012    source источник


Ответы (1)


Вы хотите сделать это

typedef void(TT::*Ptr1)(int, int);
typedef void(TT::*Ptr2)(double, double);

И исправьте функцию hello, чтобы она брала указатель на this, так как этот указатель нужен для вызова функции на объекте.

void hello(TT* obj,Ptr1 x, Ptr2 y){
    (obj->*x)(1,2);
}

Проверьте эту публикацию для получения дополнительной информации. по указателям на функции-члены.

person Karthik T    schedule 27.11.2012
comment
функция hello() НЕ нуждается в указателе this. Я думаю, что основная проблема в том, что Ptr1 и Ptr2 должны принимать указатель на это. - person user1855182; 27.11.2012
comment
Функции не будут принимать указатель на это, это ответственность вызывающей стороны. Итак, функция приветствия (или тот, кто хранит/вызывает Ptr1/Ptr2) должна будет сохранить указатель this и использовать его как (this->*ptr1)(2,3); - person Karthik T; 27.11.2012
comment
Я думаю, что модель perls близка к тому, что вы предлагаете... в том смысле, что объект передается как первый параметр... но это не perl. Если вы хотите сделать это так, как вы это понимаете, вам нужно будет сделать 2 статические версии par1/par2, которые принимают указатель this в качестве первого параметра и используют его для вызова нестатических версий. - person Karthik T; 27.11.2012
comment
теперь я определяю void hello(TT*,Ptr1, Ptr2){...}, но в TT::set() ошибка показывает, что функции hello требуются три аргумента - person user1855182; 27.11.2012
comment
вам нужно передать this в качестве первого аргумента и использовать его, когда вы хотите вызвать функции. - person Karthik T; 27.11.2012
comment
функция TT::set() является статической функцией, в set() нет [this], поэтому я не могу ее использовать - person user1855182; 27.11.2012
comment
Тогда вам нужно сесть и переосмыслить, что именно вы пытаетесь здесь сделать... что-то не так... - person Karthik T; 27.11.2012
comment
set не помечен в коде как статический. par1/par2 тоже статические? - person Karthik T; 27.11.2012
comment
Извини, я виноват. set() не является статическим. но par1 и par2 должны быть нестатическими. потому что в par1 и par2 выполняется некоторая обработка нестатических элементов данных. - person user1855182; 27.11.2012
comment
хорошо.. в основном, когда вы хотите вызвать указатель, вам нужен доступ к указателю на правильный объект. Вам нужно решить, что означает правильно и как передать этот объект вперед. - person Karthik T; 27.11.2012
comment
привет ~ не могли бы вы решить этот вопрос ниже: - person user1855182; 28.11.2012