嗯,我再一次打了砖头。再一次,我没有看到它是错误的原因,也不知道如何让它发挥作用:
我有一个类 Human 的实例。类 Human 派生自 Object .. Object 类具有名为“PerformStep”的vitrual函数。 Human 类重载此函数。
Human 类还具有“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();
}
人类:: WalkAction:
void WalkAction(){
position.x += 1;
}
CALL_MEMBER_FN(宏):
CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember))
问题是当我在调试模式下运行程序时,完全会忽略带有函数指针的行。 - 如果我按语句运行它会“跳过”该行,如果我在walk动作中放置断点它永远不会到达断点。如果我在特定行上放置一个断点,断点就会被推到下一个断点线。
这里发生了什么?
答案 0 :(得分:6)
该宏在此上下文中不执行任何操作,它只是扩展为指向函数的指针。要实际调用该函数,您需要一对额外的括号。
myObj->myfunc; // does nothing
myObj->myFunc(); // calls the function
我希望编译器已经优化了这一点,因此没有代码可以执行或打破。你可以通过以下方式清楚地看到这一点: