当我调用指针成员函数时,参数的混合值

时间:2018-07-16 12:51:45

标签: c++ function pointers qt-creator

我从另一个类调用了成员函数的指针。该函数有2个参数。 它正在工作...但是在该成员函数的调试器中,我看到参数的值已交换(混合)。我看到正确的值,但看不到正确的变量(参数)。可能是BUG ... Qt Creator c ++

void SmartCTL::OnReadBufferA(int shm_id, int length); //declaration
 hookedIDs[HOOKIDPOINTERS::READBUFFERA] = (void *)&SmartCTL::OnReadBufferA; // Save pointer of function
memcpy(hookedIDs[smartCTL.shellID],smartCTL.hookedIDs,8*sizeof(void *));// copy pointers
void (*pf)(int,int )= (void(*)( int,int ))hookedIDs[i][HOOKIDPOINTERS::READBUFFERA];// set pointer 
 pf(shells[i]->readBuff.shm_id,shells[i]->readBuff.length); // call hear

结果我得到 length 中的值 hells [i]-> readBuff.shm_id 和值 shells [i]-> readBuff.length >在 shm_id

1 个答案:

答案 0 :(得分:2)

这不是错误。您所拥有的是不确定的行为。成员函数与常规函数不同。成员函数中有一个this,它的获取方式是通过类类型的隐式函数参数实现的。所以

void SmartCTL::OnReadBufferA(int shm_id, int length)

真的很像

void SmartCTL::OnReadBufferA(SmartCTL& this_ref, int shm_id, int length)

这就是为什么您不能将指向成员函数的指针转换为指向常规函数的指针的原因。

如果您需要在“数组”中同时具有成员函数和常规函数,那么您将需要std::function。它使用类型擦除来允许您存储具有相同接口的不同类型的功能对象。例如,您可能会有类似的

std::vector<std::function<void(int, int)>> functions;
functions.push_back(some_regular_function);
functions.push_back([](int shm_id, int length){ SmartCTL s; return s(shm_id, length); });

另一个选择是使成员函数成为静态函数。静态函数没有绑定到该类的实例,因此您可以将其视为常规函数。