Вызов функции через указатель на члена класса
В следующем коде:
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
по точечной записи.