Как правильно присвоить указатель на функцию?

Рейтинг: 1Ответов: 1Опубликовано: 28.03.2011

Есть класс, который содержит метод doX и указатель на функцию pDoX.

class X
{
public:
    void (*pDoX)();
    void doX();

    X()
    {
        pDoX = doX;
    }
};

Если компилировать код, выводится ошибка:

x.c: In constructor ‘X::X()’:
x.c:9: error: argument of type ‘void (X::)()’ does not match ‘void (*)()’

Как осуществить присвоение правильно?

Ответы

▲ 4Принят

Компилятор должен знать, какому объекту "посылать мессидж" при обращении к функции, спрятанной за указателем, поэтому тип переменной должен быть соответствующий

class X
{
public:
    void (X::*pDoX)();
    void doX();

    X()
    {
        pDoX = &X::doX;
    }
};

Только вызывать придётся, указывая конкретный объект:

int main()
{
    X x;
    (x.*(x.pDoX))();
    return 0;
}

или так:

int main()
{
    X *px = new X();
    (px->*(px->pDoX))();
    return 0;
}