C++ — указатель на метод класса

Мне нужно настроить указатель на библиотечную функцию (IHTMLDocument2::write), которая является методом класса IHTMLDocument2. (для любопытных: я должен подключить эту функцию с помощью Detours)

Я не могу сделать это напрямую из-за несоответствия типов, и я не могу использовать приведение (reinterpret_cast<>, которое является «правильным», afaik, не работает)

Вот что я делаю:

HRESULT (WINAPI *Real_IHTMLDocument2_write)(SAFEARRAY *) = &IHTMLDocument2::write

Спасибо за вашу помощь!


person zakk    schedule 25.10.2009    source источник
comment
по моему опыту, чтобы указать на метод класса, указанный метод должен быть статическим.   -  person San Jacinto    schedule 26.10.2009
comment
@Сан-Хасинто. Это не правда. Вы можете иметь указатели на обычные методы.   -  person Martin York    schedule 26.10.2009


Ответы (2)


Указатель на функцию имеет следующий тип:

HRESULT (WINAPI IHTMLDocument2::*)(SAFEARRAY*)

Как видите, он определяется именем класса. Для вызова требуется экземпляр класса (поскольку это не статическая функция):

typedef HRESULT (WINAPI IHTMLDocument2::*DocumentWriter)(SAFEARRAY*);

DocumentWriter writeFunction = &IHTMLDocument2::write;

IHTMLDocument2 someDocument = /* Get an instance */;
IHTMLDocument2 *someDocumentPointer = /* Get an instance */;

(someDocument.*writefunction)(/* blah */);
(someDocumentPointer->*writefunction)(/* blah */);
person GManNickG    schedule 25.10.2009
comment
ОК... Работает правильно... Большое спасибо! Теперь мне нужно создать новую функцию типа: HRESULT (WINAPI IHTMLDocument2::*)(SAFEARRAY*) возможно ли это вне класса? - person zakk; 26.10.2009

Вам нужно использовать указатель функции-члена. Обычный указатель функции не будет работать, потому что при вызове (нестатической) функции-члена класса существует неявный указатель this, ссылающийся на экземпляр класса.

person Charles Salvia    schedule 25.10.2009
comment
+1 за решение моей прокомментированной проблемы ... но заставляет меня съеживаться на С++ за введение еще одного элемента синтаксиса для изучения. какой в ​​этом смысл? гарантировать безопасность инкапсуляции? - person San Jacinto; 26.10.2009
comment
Указатели на функции-члены используются не так часто, как кажется, но они имеют свое применение. Например, boost::bind использует указатели функций-членов, поэтому вы можете сделать, например, boost::bind(&Foo::somefunction, &instance, arg1, arg2) - person Charles Salvia; 26.10.2009
comment
@San: указатели на функции-члены (MFP) обрабатываются иначе, чем указатели на обычные функции, потому что они ЯВЛЯЮТСЯ другими... это не просто синтаксический сахар. Размер MFP часто больше (8 или 12 байт против 4 на 32-битных машинах), они передают неявный указатель this, часто они вызывают через небольшой фрагмент кода, а не напрямую (поэтому они могут вызывать виртуальные функции) . Таким образом, они являются более дорогими с точки зрения памяти и производительности ЦП (стоимость вызова), чем обычный указатель функции. - person Adisak; 26.10.2009
comment
Они могут быть особенно полезны в качестве обработчиков обратных вызовов. Кроме того, раздражающий синтаксис можно смягчить с помощью boost::mem_fn или boost::bind. - person Charles Salvia; 26.10.2009
comment
Спасибо всем. Отличная отправная точка для меня. - person San Jacinto; 26.10.2009