2013-04-22 51 views
2

一些代码:为什么一个函数有时不会运行?

Menu.Handle_MouseOvers(MousePosition); //Runs function below 

void Handle_MouseOvers(Vector2<int> &MousePositions) ///Runs function below 
{ 
    if (MenuButtons.size() > 0) 
    MenuButtons[0].CheckContains(MousePositions); 
} 

void CheckContains(Vector2<int> &MousePositions) 
{ 
    if (ButtonShape.GetShape() == "Rect" && ButtonShape.GetRect().Contains(MousePositions)) ///This doesn't run sometimes 
    { 
     MouseOver = true; 
     std::cout << "MouseOver is true" << std::endl; 
    } 
    else{ 
     std::cout << "mouseOver is false" << std::endl; 
     MouseOver = false; 
    } 
} 

出于某种原因,ButtonShape.GetRect()包含(MousePositions)只运行时间约80%。我在函数中放置了一些cout,当它失败时,它根本不运行该函数。我不明白为什么它会在大多数时间工作大声笑。有没有人有任何想法?任何帮助将不胜感激。

将此添加为编辑;

bool Contains(Vector2<int> &MousePosition) 
{ 
    std::cout << MousePosition.x << " " << MousePosition.y << std::endl; 
    if (MousePosition.x >= x && MousePosition.x <= x + Width && MousePosition.y >= y && MousePosition.y <= y + Height) 
     return true; 
    else 
     return false; 
} 
+0

短路评估? – phoeagon 2013-04-22 02:12:15

+0

请发布一个完整的示例,重新创建您所问的问题。该示例应尽可能最小化。 – 2013-04-22 02:13:17

回答

2

一个原因可能是因为这是一个逻辑/布尔表达式:

ButtonShape.GetShape() == "Rect" && ButtonShape.GetRect().Contains(MousePositions) 

&&作品是这样的:

  • 如果左侧表达式为假,则它在不评估右侧表达式的情况下评估为假
  • 如果左侧表达式评估为真,那么只有第二表情评估
    • 现在,如果右侧表达式评估为假,则结果为假
    • 否则,最后的结果是正确的。

如果您正在测试删除GetShape后,然后确保Shape被设置为每次Rect


如果该功能仍没有运行每次,那么可能是你可能不正确,每次设置MousePositions。这将取决于您的功能代码,因为该功能未运行而出现。

+0

布尔表达式的左边是否为边?即使它不是?哈哈 – Chivos 2013-04-22 01:48:20

+1

@Chivos左边的表达式是布尔表达式的一部分,还是你问别的东西? – asheeshr 2013-04-22 01:50:04

+0

我将第一个表达式取出,但仍然有时它不运行ButtonShape.GetRect()。Contains(MousePositions);.我在包含函数的开始处有一个“hi”cout,它什么都不做。 – Chivos 2013-04-22 01:52:01

1

如果ButtonShape.GetShape()!=“Rect”,那么第二个表达式(包含对ButtonShape.GetRect()。Contains(MousePositions))的调用将不会被调用,因为它不需要满足整个表达 - 这就是所谓的“短路”。

+0

我把ButtonShape.GetShape()拿出来了,它仍然会发生。 – Chivos 2013-04-22 01:53:13

相关问题