0

好吧,我又一次碰上了砖头。再次,我看不出错误的原因,也不知道如何使它起作用:

我有一个Human类的实例。Human类派生自Object .. Object类有一个名为“PerformStep”的虚拟函数。Human Class 重载了这个函数 。Human类也具有“WalkAction”功能。现在我想在 PerformStep - By member function pointer 期间调用这个“walkaction”。
我喜欢通过指针来做到这一点:
人类很愚蠢:他们知道如何走路,但不知道何时。所以在这个步骤中会问一个上帝实例:“我现在应该做什么” - 然后那个上帝实例返回指向正确成员函数的指针。

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

Human::WalkAction:

void WalkAction(){
    position.x += 1;
}

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

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

这里发生了什么?

4

1 回答 1

6

该宏在这种情况下什么都不做,它只是扩展为指向函数的指针。要实际调用该函数,您需要一对额外的括号。

myObj->myfunc;   // does nothing
myObj->myFunc(); // calls the function 

我希望编译器已经对此进行了优化,因此没有要执行或中断的代码。您可以通过以下方式清楚地看到这一点:

  • 首先不使用宏(首选)
  • 使用编译器的选项输出与相应汇编器交错的源代码。
于 2010-11-22T21:04:29.647 回答