语句完全被忽略(好像:编译器省略了?)

pau*_*l23 0 c++ member-function-pointers

好吧,我再一次打砖了.再一次,我没有看到它是错误的原因,不知道如何让它工作:

我有一个类Human的实例.Human类派生自Object .. Object类有一个名为"PerformStep"的vitrual函数.在人类类重载这个函数. 人类也有"WalkAction"功能.现在我想在PerformStep - By成员函数指针期间调用这个"walkaction".
我喜欢用指针做这个:
人类是愚蠢的:他们知道如何走路,但不知道何时走路.所以在这一步中会问一个神实例:"我现在该怎么做" - 然后那个神实例返回指向正确成员函数的指针.

virtual void PerformStep() 
{
    postion.x += 0; //redundant line to check for the debugger
    CALL_MEMBER_FN(*this,&Human::WalkAction);
    Object::PerformStep();
}
Run Code Online (Sandbox Code Playgroud)

人力:: WalkAction:

void WalkAction(){
    position.x += 1;
}
Run Code Online (Sandbox Code Playgroud)

CALL_MEMBER_FN(宏):
CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember))

问题是当我在调试模式下运行程序时,它完全忽略了带有函数指针的行. - 如果我按语句运行它会"跳过"该行,如果我在walk动作中放置断点它永远不会到达断点.如果我在特定行上放置一个断点,断点就会被推到下一个断点线.

这里发生了什么?

Ste*_*end 6

该宏在此上下文中不执行任何操作,它只是扩展为指向函数的指针.要实际调用该函数,您需要一对额外的括号.

myObj->myfunc;   // does nothing
myObj->myFunc(); // calls the function 
Run Code Online (Sandbox Code Playgroud)

我希望编译器已经优化了这一点,因此没有代码可以执行或打破.您可以通过以下方式清楚地看到

  • 首先不使用宏(首选)
  • 使用编译器的选项输出与相应汇编器交错的源代码.