Заявления полностью игнорируются (как будто: опущено компилятором?) - PullRequest
0 голосов
/ 23 ноября 2010

Ну, я еще раз попал в кирпич. Снова что-то, я не вижу причины, по которой это неправильно, и понятия не имею, как заставить его работать:

У меня есть экземпляр класса * 1003.* Human .Класс Человек является производным от Объект .. Класс Объект имеет функцию vitrual, называемую "PerformStep".Класс Human перегружает эту функцию. Человек класс также имеет функцию "WalkAction".Теперь я хочу вызвать эту «прогулку» во время указателя на функцию-член PerformStep - By.
Мне нравится делать это с помощью указателя следующим образом:
Люди глупы: они знают , как ходить, ноне когда .Таким образом, экземпляр бога будет задан на шаге: «что мне теперь делать» - а затем этот экземпляр бога возвращает указатель на правильную функцию-член.

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))

Проблема в том, что когда я запускаю программу в режиме отладки, она полностью игнорирует строку суказатель на функцию- Если я запускаю это оператор за оператором, он «перепрыгивает» через линию, если я ставлю точку останова в действии ходьбы, она никогда не достигает точки останова. Если я ставлю точку останова на конкретной строке, точки останова перемещаются к следующейline.

Что здесь происходит?

1 Ответ

6 голосов
/ 23 ноября 2010

Этот макрос ничего не делает в этом контексте, он просто расширяется до указателя на функцию.Чтобы действительно вызвать функцию, вам нужна дополнительная пара скобок.

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

Я ожидаю, что компилятор оптимизировал это, поэтому нет кода, который нужно выполнить или сломать.Это можно ясно увидеть:

  • без использования макроса в первую очередь (предпочтительно)
  • с использованием опции вашего компилятора для вывода исходного кода, чередующегося с соответствующим ассемблером.1010 *
...