2013-04-07 65 views
1

我正在寫一個C++(C++ 11)庫(OpenGL圖形引擎)。用於事件監聽器註冊的存儲指針

我的問題圍繞着註冊事件監聽器的良好編程技術。

我有像這樣類之間的關係:

Program --has - >SceneManager --has - >ShaderManager --has - > * Shader

Shader類允許其他對象進行註冊自己作爲ShaderBindListener,這意味着只要着色器調用bind()方法,它就會通知任何偵聽器。

ShaderManager該類是外部圖書館有權訪問的類,並且可以從中創建新的Shader對象。

現在,我希望每個對象ShaderProgram對象作爲ShaderBindListener,使得當Shader被束縛,Program對象被通知,並且可以通過矩陣數據等的Shader在GPU上。

我最初的解決方案是讓Program對象將指向自己的指針傳遞給SceneManager,該指針將指針傳遞給ShaderManager,然後存儲它。無論何時創建新的ShaderShaderManager都會將Program添加爲偵聽器。

這工作得很好 - 但看起來 - 我不知道,在設計方面有點不對。

也許我只是在迂腐 - 但是這對你們來說好像是不錯的設計嗎?

回答

2

有幾個選項,優點和缺點往往是有爭議的,取決於你的風格。

辛格爾頓

如果一個進程將只擁有Program一個實例,那麼你可以做一個Programsingleton。這樣,你不需要傳遞指針。

一箇中間對象

不是傳遞的this指針通過的,你可以把它通過它封裝Program和管理它的事件處理的對象。這樣,其他類不需要知道Program,他們只需要事件類的接口。

事實上,如果你不反對使用Boost,那麼他們只是你要找的:Signals2庫。

+0

謝謝@anthony。之前從未聽說過Boost Signals,我會檢查一下。我最初使用的是單身物件,但最近我已經準備好了它們是如何成爲所有邪惡的產物,所以我一直試圖從它們中重構。 – Jarrett 2013-04-07 04:26:37