`
rollstone
  • 浏览: 38807 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

函数指针实现回掉函数

 
阅读更多
 用法:
头文件中声明:
DECL_LINK( PaintingFirstLineHdl, PaintFirstLineInfo* );

宏:#define DECL_LINK( Method, ArgType ) \
long Method( ArgType ); \
static long LinkStub##Method( void* pThis, void* )
展开:
long PaintingFirstLineHdl(PaintFirstLineInfo*);
static long LinkStubPaintingFirstLineHdl(void*pThis,void*);
等于声明了两个方法。

CXX文件: IMPL_LINK(OutlineView, PaintingFirstLineHdl, PaintFirstLineInfo*, pInfo)
宏:
#define IMPL_LINK( Class, Method, ArgType, ArgName ) \
IMPL_STUB( Class, Method, ArgType ) \
long Class::Method( ArgType ArgName )

#define IMPL_STUB(Class, Method, ArgType) \
long __EXPORT Class::LinkStub##Method( void* pThis, void* pCaller) \
{ \
return ((Class*)pThis )->Method( (ArgType)pCaller ); \
}
展开:
long_EXPORT OutlineView::LinkStubPaintingFirstLineHdl(void *pThis,void *pCaller)
{
return ((Outlineview*)pThis)->PaintingFirstLineHdl((PaintFirstLineInfo*)pCaller)
}
long OutlineView::PaintingFirstLineHdl(PaintFirstLineInfo* plnfo)

传递函数指针:
Link alink (LINK(this,OutlineView,PaintingFirstLineHdl))
宏:
typedef long (*PSTUB)( void*, void* );
#define LINK( Inst, Class, Member ) Link( (Class*)Inst, (PSTUB)&Class::LinkStub##Member )
展开:
Link((OutlineView*)this,(PSTUB)&OutlineView::LinkStubPaintingFirstLineHdl)
Link类的构造函数: Link( void* pLinkHdl, PSTUB pMemFunc );
pLinkHdl: 对象的地址。
pMemFunc: 指向所要调用的函数指针。

这样把alink传递到任何地方,只要对象还存在就能调用PaintingFirstLineHdl这个方法。

调用:
inline long Link::Call(void *pCaller) const
{
return pFunc ? (*pFunc)(pInst, pCaller) : 0;
}

================
补充:
 IMPL_LINK(OutlineView, PaintingFirstLineHdl, PaintFirstLineInfo*, pInfo)
void ImpEditEngine::Paint( OutputDevice* pOutDev, Rectangle aClipRec, Point aStartPos, sal_Bool bStripOnly, short nOrientation )
mpOutliner->SetPaintFirstLineHdl(LINK(this,OutlineView,PaintingFirstLineHdl));
////////////////////////////////////////////////////////////////////////////////////
Link aLink( LINK(this,OutlineView,EventMultiplexerListener) );
mpOutlineViewShell->GetViewShellBase().GetEventMultiplexer()->AddEventListener(
aLink,
tools::EventMultiplexerEvent::EID_CURRENT_PAGE
| tools::EventMultiplexerEvent::EID_PAGE_ORDER);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
赋值:
mpOutliner->SetPaintFirstLineHdl(LINK(this,OutlineView,PaintingFirstLineHdl));
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
调用:
inline long Link::Call(void *pCaller) const
{
return pFunc ? (*pFunc)(pInst, pCaller) : 0;
}
构造函数: Link( void* pLinkHdl, PSTUB pMemFunc );
pLinkHdl: 对象的地址。
pMemFunc: 指向所要调用的函数指针。
宏:
typedef long (*PSTUB)( void*, void* );
#define LINK( Inst, Class, Member ) Link( (Class*)Inst, (PSTUB)&Class::LinkStub##Member )
mpOutliner->SetPaintFirstLineHdl(LINK(this,OutlineView,PaintingFirstLineHdl));


Using ## concatenates what's before the ## with what's after it.

展开:Link((OutlineView*)this,(PSTUB)&OutlineView::LinkStub##PaintingFirstLineHdl)


LinkStubPaintingFirstLineHdl


IMPL_LINK(OutlineView, PaintingFirstLineHdl, PaintFirstLineInfo*, pInfo)
按照下面的宏展开:
IMPL_STUB(OutlineView,PaintingFirstLineHdl,PaintFirstLINEInfo*) \
long OutlineView::PaintingFirstLineHdl(PaintFirstLineInfo* plnfo)

////////////////////////////////////////////////////////////////////////////////
long_EXPORT OutlineView::LinkStubPaintingFirstLineHdl(void *pThis,void *pCaller){
return ((Outlineview*)pThis)->Method((argType)pCaller) }\
long OutlineView::PaintingFirstLineHdl(PaintFirstLineInfo* plnfo)

////////////////////////////////////////////////////////////////////////////

#define IMPL_LINK( Class, Method, ArgType, ArgName ) \
IMPL_STUB( Class, Method, ArgType ) \
long Class::Method( ArgType ArgName )


#define IMPL_STUB(Class, Method, ArgType) \
long __EXPORT Class::LinkStub##Method( void* pThis, void* pCaller) \
{ \
return ((Class*)pThis )->Method( (ArgType)pCaller ); \
}
分享到:
评论

相关推荐

    利用函数指针实现C的回调函数,实现调用者和底层驱动的解耦 第二种方式.zip

    利用函数指针实现C的回调函数,实现调用者和底层驱动的解耦 第二种方式利用函数指针实现C的回调函数,实现调用者和底层驱动的解耦 第二种方式利用函数指针实现C的回调函数,实现调用者和底层驱动的解耦 第二种方式

    c++ 函数指针和回调的使用

    在C++编程中,函数指针是一个非常重要的概念,它允许我们存储函数的地址并可以在之后的代码中调用。...函数指针和回调是C++编程中的强大工具,理解并熟练掌握它们能够帮助我们编写更加灵活和高效的应用程序。

    指针函数和函数指针变量

    在事件驱动编程中,函数指针可以用于回调函数,当特定事件发生时,调用对应的处理函数。此外,它们也常用于实现策略模式、工厂模式等设计模式。 了解和熟练掌握指针函数和函数指针变量是C语言高级编程的关键,它们...

    函数指针&回调函数培训讲义

    函数指针&回调函数培训讲义,帮助学习函数指针以及回调函数。

    一般函数指针和类的成员函数指针

    函数指针在C++中提供了强大的功能,特别是在处理回调函数或实现策略模式时。理解一般函数指针和类的成员函数指针之间的区别,能够帮助开发者更灵活地设计和实现程序逻辑。尤其是当涉及到类的非静态成员函数时,需要...

    C/C++ 函数指针的意义,函数指针的用法

    函数指针不仅可以作为局部变量,还可以作为函数的参数,实现对回调函数的传递。这在设计模块化、可扩展的系统时尤为有用。例如: ```cpp int test2(int(*ra)(int), int b); ``` 这里,`ra`是一个函数指针参数,...

    利用函数指针实现C的回调函数,实现调用者和底层驱动的解耦第一种方式.zip

    利用函数指针实现C的回调函数,实现调用者和底层驱动的解耦第一种方式利用函数指针实现C的回调函数,实现调用者和底层驱动的解耦第一种方式利用函数指针实现C的回调函数,实现调用者和底层驱动的解耦第一种方式利用...

    函数指针和函数对象

    在实际应用中,函数指针和函数对象都可以用于实现回调函数、事件处理和其他高级编程技术。但是,函数指针更适合用于简单的回调函数,而函数对象更适合用于复杂的业务逻辑和算法实现。 函数指针和函数对象是C++语言...

    函数指针和指针函数的区别

    在C/C++编程语言中,函数指针和指针函数是两个不同的概念,虽然它们都涉及到指针和函数,但其用法和含义各有特点。理解这两者的差异对于编写高效、灵活的代码至关重要。 首先,我们来解释"函数指针"。函数指针是一...

    详解函数指针和指针函数

    总之,函数指针和指针函数是C语言中高级的编程工具,它们增加了代码的灵活性和可扩展性,常用于回调函数、动态调度、数据结构(如链表)的实现等场景。理解和熟练掌握这些概念对于深入理解C语言及其在复杂系统中的...

    函数指针和指针函数

    此外,函数指针还可以作为其他函数的参数,实现回调机制,或者在数据结构(如链表)中存储函数指针以实现特定操作。 2. **指针函数** 常用于返回内存分配的结果、数组的某个元素的地址或者结构体的某个字段的地址等...

    C51 函数指针与再入函数

    4. 使用 OVERLAY 指令确定调用树:在 C51 编程中,使用 OVERLAY 指令可以确定调用树,并实现函数指针的调用。 5. 再入函数的指针:再入函数是指在函数内部调用自己本身的函数。函数指针可以用来实现再入函数的调用...

    C++ 一般(普通)函数指针、类成员函数指针,用法区别,以及强制转换

    在实际编程中,理解函数指针的这些概念至关重要,因为它们是许多高级C++技术的基础,如回调、事件处理和模板元编程。`函数指针.cpp`、`StdAfx.cpp`、`函数指针.dsp`、`函数指针.dsw`和`StdAfx.h`等文件可能包含示例...

    函数指针和指针函数,const的用法,指针常量,常量指针的用法

    这段代码实现了通过函数指针找到多个输入数字中的最大值。首先定义了一个函数指针 `p`,然后将其赋值为 `f` 函数的地址。接下来通过循环读取数字,并使用函数指针 `p` 调用 `f` 函数来确定最大值。 通过以上介绍,...

    易语言简单类函数指针

    4. **类函数的使用场景**:类函数指针在事件处理、异步操作、回调函数等方面有广泛应用。例如,我们可以创建一个消息队列,每个消息包含一个类函数指针,根据不同的消息调用不同的处理函数。 5. **Windows API的...

    彻底理解指针,指针数组和数组指针,指针函数和函数指针

    3. **函数指针**:在实现回调函数、策略模式等设计模式时非常有用。 4. **指针函数**:通常用于返回动态分配的数组或其他复杂数据结构。 通过上述分析,我们可以看出指针虽然看似复杂,但其实有着明确的定义和规则...

    函数指针与指针函数应用程序

    通过函数指针,我们可以在运行时动态地调用不同的函数,这在处理回调函数、算法比较或实现多态性时特别有用。例如,我们可以定义一个函数指针类型,然后声明并初始化一个函数指针变量: ```c++ // 定义一个返回整型...

    函数指针和指针函数的理解

    在C语言中,函数指针和指针函数是两个重要的概念,它们经常出现在较为复杂的程序设计中,尤其在回调函数、动态绑定等场景中发挥着重要作用。 **函数指针**指的是指向函数的指针变量,它存储的是函数的入口地址。当...

    C语言指针函数和函数指针详细介绍.

    C语言指针函数和函数指针详细介绍 C语言中指针函数和函数指针是两个不同的概念,但它们之间存在着紧密的联系。本文将对C语言中的指针函数和函数指针进行详细的介绍。 一、指针函数 指针函数是指返回值为指针的...

    回调函数就是一个通过函数指针调用的函数

    回调函数是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的...

Global site tag (gtag.js) - Google Analytics