получить функцию PTR для функции-члена экземпляра класса? - PullRequest
3 голосов
/ 28 декабря 2010
class gfx { 
    void resize(int x, int y);
}

gfx g;    

могу ли я как-нибудь привести g.resize к 'void (*) (int, int)'?

Ответы [ 2 ]

6 голосов
/ 28 декабря 2010

Нет. gfx::resize имеет тип void(gfx::*)(int, int). Вы не можете осмысленно преобразовать его в тип void(*)(int, int), потому что вы можете вызывать его только как функцию-член для объекта типа gfx.

Функция-член может быть вызвана только для экземпляра класса, поэтому, учитывая ваш gfx g;, вы можете вызвать g.resize(), но вы не можете просто вызвать resize(), как если бы это была обычная функция. Обычный указатель на функцию не может указывать на функцию-член, потому что у него нет никакого способа привязать вызов функции к экземпляру класса.

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

Если вы хотите иметь возможность вызывать функцию-член с помощью обычного указателя на функцию, вы можете создать оболочку функции, не являющейся членом (или статической функции-члена), с параметром, которому вы можете передать экземпляр объекта, для которого вызовите функцию-член. Например, вы могли бы иметь:

void resize(gfx* obj, int x, int y) {
    return obj->resize(x, y);
}

Эта функция без элемента resize имеет тип void(*)(gfx*, int, int) и может вызываться как функция без элемента. Обобщенной формой этого подхода являются std::function и std::bind средства, найденные в C ++ 0x (вы также можете найти их в Boost и в C ++ TR1).

0 голосов
/ 28 декабря 2010

Да, вы можете сделать это:

void easy_resize(int x, int y) { g.resize(x, y); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...