C++ - 指向类方法的指针

Posted

技术标签:

【中文标题】C++ - 指向类方法的指针【英文标题】:C++ - Pointer to a class method 【发布时间】:2009-10-25 21:02:28 【问题描述】:

我必须设置一个指向库函数 (IhtmlDocument2::write) 的指针,这是 IHTMLDocument2 类的一个方法。 (对于好奇的人:我必须用 Detours 来挂钩该功能)

我不能直接这样做,因为类型不匹配,我也不能使用强制转换(reinterpret_cast<> 这是“正确的”afaik 不起作用)

这是我正在做的事情:

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

感谢您的帮助!

【问题讨论】:

我的经验是,为了指向一个类方法,该方法必须是静态的。 @圣哈辛托。这不是真的。您可以拥有指向普通方法的指针。 【参考方案1】:

指向函数的指针有以下类型:

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 */);

【讨论】:

好的...工作正常...非常感谢!现在我必须创建一个新函数,其类型为:HRESULT (WINAPI IHTMLDocument2::*)(SAFEARRAY*) 这可能来自类外吗?【参考方案2】:

您需要使用member function pointer。普通函数指针不起作用,因为当您调用(非静态)类成员函数时,有一个隐含的 this 指针指向该类的实例。

【讨论】:

+1 用于解决我评论过的问题......但让我对 C++ 感到畏缩,因为它引入了另一个要学习的语法项目。有什么意义呢?保证封装安全? 成员函数指针似乎并不经常使用,但它们确实有其用途。例如, boost::bind 利用成员函数指针,因此您可以这样做,例如 boost::bind(&Foo::somefunction, &instance, arg1, arg2) @San:成员函数指针 (MFP) 的处理方式与普通函数指针不同,因为它们 不同......这不仅仅是语法糖。 MFP 的大小通常更大(8 或 12 字节 vs 32 位机器上的 4 字节),它们传递一个隐式 this 指针,通常它们通过一小块 thunking 代码而不是直接调用(因此它们可能调用虚函数) .因此,它们在内存方面和 CPU 性能(调用成本)方面都比普通函数指针更昂贵。 它们作为回调处理程序特别有用。另外,烦人的语法可以通过使用 boost::mem_fn 或 boost::bind 来缓解。 谢谢大家。对我来说是一个很好的起点。

以上是关于C++ - 指向类方法的指针的主要内容,如果未能解决你的问题,请参考以下文章

指向被覆盖方法的 C++ 方法指针

使用指向类私有方法的指针的命名参数惯用语

在 C++ 中使用指针和指向指针的指针读取和存储序列化对象的快速方法

C++:友元函数,派生类

c ++:将指针传递给基类时访问派生类方法?

c ++如何获取指向另一个类中的当前对象的指针?