我在C++中製作遊戲,想知道如何在調用同一個函數時讓一個類的兩個對象做不同的事情。我的意思是我有2個按鈕,當我點擊一個按鈕時,它應該開始遊戲,當我點擊另一個時,它應該結束它。這只是一個簡單的例子,但基本上我只想調用click()函數,並且您單擊的按鈕將執行與其他每個按鈕不同的代碼。如何讓同一個類的對象在同一個函數中做不同的事情?
回答
我認爲你在找什麼叫多態。退房代碼:
#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你可以找到一個很好的教程。
在檢查對象某些屬性的函數中添加一個條件,例如,一個實例變量的值。
你可以有一個函數對象(仿函數)或函數指針作爲數據成員。
每個實例都會爲該點擊提供不同的函子。
一種方法是創建一個接口(對於C++,它是一個具有純虛擬方法和虛擬析構函數的類)。讓我們打電話給那個class clickHandler來跟隨你的按鈕示例。在點擊功能中,您可以在clickHandler上調用doclick
按鈕。現在當你創建你的按鈕時,你給它們一個正確的clickHandler的子類。
其他選項包括使用C++的新增lambda表達式。
坦率地說,這聽起來很糟糕的設計。實現這一點的唯一方法是將標誌或狀態以其他形式傳遞給方法。但是如果你這樣做了,Button已經擁有了關於需要完成什麼的所有知識,並且你還可以創建並調用單獨的方法。或者,您可以放棄您的要求,使對象具有相同的類並使用虛擬方法繼承。然而,如果不同的子類對那些可能是壞設計標誌的語義有很大的不同。所以我建議使用不同的方法並明確地調用它們。
這不是什麼糟糕的設計。使用回調來定製行爲是一種標準模式。見例如回答http://stackoverflow.com/a/23301983/280314如何做到這一點。 –
我假設你正在構建你自己的遊戲引擎,而不是使用真正處理這些事情的庫。
你想要做的是註冊每個函數的回調。這就是所有的UI庫/框架所做的。舉個簡單的例子:
class Button{
std::function<void()> callback;
public:
void connect(std::function<void()> func){
callback=func
}
void click(){
callback();
}
};
通過提供不同的回調連接,你可以實現不同的功能。
+1。如果按鈕有其他相同的代碼,'std :: function'成員可能是正確的答案。 – aschepler
- 1. 不同類型的同一個對象
- 2. 不同類型的對象在同一個向量數組中?
- 3. 如何在python的不同類上使用同一個對象?
- 4. 在不同的對象上做同樣的事情
- 5. 如何在同一個對象中調用另一個函數?
- 6. 你可以讓一個類的所有對象用一個方法調用做同樣的事情嗎?
- 7. 綁定多個pthread,每個綁定到同一個類的不同對象的同一個成員函數
- 8. 如何讓1個按鈕改變ID做不同的事情?
- 9. 如何讓2個不同的對象對JavaScript中的同一個函數作出反應
- 10. 同一類中的一個對象如何分配給C++中同一類的另一個對象?
- 11. 如何將一個類的對象傳遞給同一個類的函數?
- 12. 不同類型的對象作爲一個函數的參數
- 13. 同一個對象在不同的類中?
- 14. 如何同時在同一個JPanel中處理兩個不同的對象?
- 15. 如何在另一個類的不同包中創建一個類的對象
- 16. 做一個onClick事件,每隔一次點擊做一些不同的事情?
- 17. 在不同的類中釋放/訪問同一個名字的不同對象
- 18. 如何從同一個類中獲取不同對象的數據
- 19. Python:如何區分同一類中兩個不同對象的兩個變量?
- 20. 如何從同一個對象的函數內的某個函數傳遞一個對象的函數?
- 21. Python中同一類的多個對象
- 22. 如何讓一個函數返回不同類型
- 23. 讓對象記住同類型的下一個對象
- 24. 當做同樣的事情,但在另一個類時,得到一個NullPointerException
- 25. 如何讓按鈕在同一視圖中完成不同的事情?
- 26. 在同一個HTML中的兩個不同的jQuery函數
- 27. NoSuchMethod:參數比較不同。同一類型,不同的對象
- 28. 兩個不同的INSERT INTO語句做同樣的事情
- 29. 如何在同一個模型中存儲同一對象的多個實例?
- 30. 讓不同類中不同的div在同一行
將類中的狀態(按鈕號)放入類中,並讓您的函數選擇如何處理它 –
使用繼承和虛函數_or_指向成員函數的指針_或_指定指定要執行的操作的某個標誌。 –
@CaptainObviously我認爲在這種情況下繼承比需要更復雜一點。 –