gpt4 book ai didi

c++ - 回调到非静态 C++ 成员函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:11 25 4
gpt4 key购买 nike

我希望有人能阐明这个让我感到困惑的代码片段。

   //-------------------------------------------------------------------------------
// 3.5 Example B: Callback to member function using a global variable
// Task: The function 'DoItB' does something that implies a callback to
// the member function 'Display'. Therefore the wrapper-function
// 'Wrapper_To_Call_Display is used.

#include <iostream.h> // due to: cout

void* pt2Object; // global variable which points to an arbitrary object

class TClassB
{
public:

void Display(const char* text) { cout << text << endl; };
static void Wrapper_To_Call_Display(char* text);

/* more of TClassB */
};


// static wrapper-function to be able to callback the member function Display()
void TClassB::Wrapper_To_Call_Display(char* string)
{
// explicitly cast global variable <pt2Object> to a pointer to TClassB
// warning: <pt2Object> MUST point to an appropriate object!
TClassB* mySelf = (TClassB*) pt2Object;

// call member
mySelf->Display(string);
}


// function does something that implies a callback
// note: of course this function can also be a member function
void DoItB(void (*pt2Function)(char* text))
{
/* do something */

pt2Function("hi, i'm calling back using a global ;-)"); // make callback
}


// execute example code
void Callback_Using_Global()
{
// 1. instantiate object of TClassB
TClassB objB;


// 2. assign global variable which is used in the static wrapper function
// important: never forget to do this!!
pt2Object = (void*) &objB;


// 3. call 'DoItB' for <objB>
DoItB(TClassB::Wrapper_To_Call_Display);
}

问题1:关于这个函数调用:

DoItB(TClassB::Wrapper_To_Call_Display)

为什么 Wrapper_To_Call_Display 不接受任何参数,尽管根据其声明它应该接受 char* 参数?

问题2: DoItB声明为

void DoItB(void (*pt2Function)(char* text))

到目前为止我所理解的是 DoItB 将函数指针作为参数,但为什么函数调用 DoItB(TClassB::Wrapper_To_Call_Display)TClassB::Wrapper_To_Call_Display 作为论点甚至强硬它不是一个指针?

提前致谢

代码片段来源:http://www.newty.de/fpt/callback.html

最佳答案

在 C/C++ 中,当使用不带参数的函数名称时(即没有括号),它是指向函数的指针。所以 TClassB::Wrapper_To_Call_Display 是指向内存中实现函数代码的地址的指针。

因为 TClassB::Wrapper_To_Call_Display 是一个指向 void 函数的指针,该函数采用单个 char*,所以是 void ( *)(char* test) 所以它匹配 DoItB 要求的类型。

关于c++ - 回调到非静态 C++ 成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10060219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com