Вызов функции через указатель на члена класса

В следующем коде:

class foo
{
public:
    void foo_function() {};
};

class bar
{
public:
    foo foo_member;

    void bar_function(foo bar::*p_foo)
    {
        // what is the corrct sintax for following:
        this->*p_foo->foo_function(); // expression must have a pointer type??
    }
};


int main()
{
    foo foo_obj;
    bar bar_obj;
    typedef foo bar::*p_foo;
    p_foo blah = &bar::foo_member;
    bar_obj.bar_function(blah);
    return 0;
}

Какой будет правильный синтаксис, чтобы заставить bar::bar_function работать?

1 ответ

Решение

Это работает в Ideone:

void bar_function(foo bar::*p_foo)
{
    (this->*p_foo).foo_function();
}

Все дело в правильном уровне косвенности. поскольку p_foo указатель на член, мы должны разыменовать его перед попыткой доступа к нему из this, На данный момент у вас есть фактическая foo_member объект, а не указатель на него, так что вы можете вызвать его foo_function по точечной записи.

Другие вопросы по тегам