2013-04-22 42 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

相關問題