2014-04-25 82 views
1

我在C++中製作遊戲,想知道如何在調用同一個函數時讓一個類的兩個對象做不同的事情。我的意思是我有2個按鈕,當我點擊一個按鈕時,它應該開始遊戲,當我點擊另一個時,它應該結束它。這只是一個簡單的例子,但基本上我只想調用click()函數,並且您單擊的按鈕將執行與其他每個按鈕不同的代碼。如何讓同一個類的對象在同一個函數中做不同的事情?

+0

將類中的狀態(按鈕號)放入類中,並讓您的函數選擇如何處理它 –

+0

使用繼承和虛函數_or_指向成員函數的指針_或_指定指定要執行的操作的某個標誌。 –

+0

@CaptainObviously我認爲在這種情況下繼承比需要更復雜一點。 –

回答

2

我認爲你在找什麼叫多態。退房代碼:

#include <iostream> 
    using namespace std; 
    class Button 
    { 
    public: 
      virtual void click() 
      { 
        cout << "Button click\n"; 
      } 
    }; 

    class StartButton : public Button 
    { 
    public: 
      void click() 
      { 
        cout << "Start click\n"; 
      } 
    }; 

    class EndButton : public Button 
    { 
    public: 
      void click() 
      { 
        cout << "End click\n"; 
      } 
    }; 

    void make_click (Button * button) 
    { 
      button -> click(); 
    } 

    int main() 
    { 
      StartButton * start = new StartButton(); 
      EndButton * end = new EndButton(); 
      make_click(start); 
      make_click(end); 
      return 0; 
    } 

輸出是:

Start click 
    End click 

Here你可以找到一個很好的教程。

2

在檢查對象某些屬性的函數中添加一個條件,例如,一個實例變量的值。

2

你可以有一個函數對象(仿函數)或函數指針作爲數據成員。
每個實例都會爲該點擊提供不同的函子。

1

一種方法是創建一個接口(對於C++,它是一個具有純虛擬方法和虛擬析構函數的類)。讓我們打電話給那個class clickHandler來跟隨你的按鈕示例。在點擊功能中,您可以在clickHandler上調用doclick按鈕。現在當你創建你的按鈕時,你給它們一個正確的clickHandler的子類。

其他選項包括使用C++的新增lambda表達式。

0

坦率地說,這聽起來很糟糕的設計。實現這一點的唯一方法是將標誌或狀態以其他形式傳遞給方法。但是如果你這樣做了,Button已經擁有了關於需要完成什麼的所有知識,並且你還可以創建並調用單獨的方法。或者,您可以放棄您的要求,使對象具有相同的類並使用虛擬方法繼承。然而,如果不同的子類對那些可能是壞設計標誌的語義有很大的不同。所以我建議使用不同的方法並明確地調用它們。

+0

這不是什麼糟糕的設計。使用回調來定製行爲是一種標準模式。見例如回答http://stackoverflow.com/a/23301983/280314如何做到這一點。 –

3

我假設你正在構建你自己的遊戲引擎,而不是使用真正處理這些事情的庫。

你想要做的是註冊每個函數的回調。這就是所有的UI庫/框架所做的。舉個簡單的例子:

class Button{ 
std::function<void()> callback; 

public: 

void connect(std::function<void()> func){ 
    callback=func 
} 
void click(){ 
    callback(); 
} 
}; 

通過提供不同的回調連接,你可以實現不同的功能。

+0

+1。如果按鈕有其他相同的代碼,'std :: function'成員可能是正確的答案。 – aschepler

相關問題