Закрытая функция-член, которая принимает указатель на закрытый член в том же классе - PullRequest
3 голосов
/ 10 ноября 2009

Как я могу это сделать? (Следующий код НЕ работает, но я надеюсь, что это объясняет идею.)

class MyClass  
{  
    ....  
 private:
    int ToBeCalled(int a, char* b);

    typedef (MyClass::*FuncSig)(int a, char* b);

    int Caller(FuncSig *func, char* some_string);
}

Я хочу позвонить вызывающему как-то так:

Caller(ToBeCalled, "stuff")

и Caller вызовите ToBeCalled с любыми параметрами, которые, по его мнению, необходимо передать. Если это вообще возможно, я хочу сохранить все в секрете в своем классе. В действительности, у меня было бы около 50 функций, таких как ToBeCalled, поэтому я не вижу способа избежать этого.

Спасибо за любые предложения. :)

Ответы [ 2 ]

7 голосов
/ 10 ноября 2009

Ты большую часть пути туда. Вам не хватает возвращаемого типа из typedef, оно должно быть

typedef int (MyClass::*FuncSig)(int, char*);

Теперь вам просто нужно правильно его использовать:

int Caller(FuncSig func, int a, char* some_string)
{
    return (this->*func)(a, some_string);
}

Вы хотите передать простые FuncSig экземпляры, а не FuncSig* - FuncSig* - это указатель на указатель на функцию-член с дополнительным ненужным уровнем косвенности. Затем вы используете оператор «стрелка-звезда» (не его официальное название) для его вызова:

(object_to_be_called_on ->* func)(args);

Для объектов без указателя (например, объекты в стеке или ссылки на объекты) вы используете оператор точка-звезда:

MyClass x;
(x .* func)(args);

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

0 голосов
/ 10 ноября 2009

Я предполагаю, что вы уже пробовали Caller(MyClass::ToBeCalled, "stuff"), но есть ли какая-то конкретная причина, по которой вам нужен указатель на функцию? Также, пожалуйста, опубликуйте фактическую ошибку компилятора.

...