2014-04-21 123 views
1

我想根據我在OpenGL中的鼠標移動來更新我的相機參數。我正在使用GLFW。有在GLFW在C++中更新靜態函數中的非靜態成員

glfwSetCursorPosCallback(window, mouseMoveCallback); 

一個預定義的事件處理程序,我使用註冊mouseMoveCallback()函數。我已經在一個類中聲明瞭我的相機,並且在該程序中使用了Camera類的一個實例。 Camera類中的成員是非靜態的,但mouseMoveCallback函數是靜態的。我知道靜態函數不可能訪問非靜態成員。我可以更新Camera類的非靜態實例的成員的最佳方式是什麼?

我能夠通過使用全局變量和使用mouseMoveCallback()函數來更新全局,然後從非靜態成員函數讀取更新的全球價值,以獲得所需的功能。但是,當我想添加更多的參數來讀取時,如鍵盤輸入等,這會變得很難看,所以我想知道是否有更好的方法來做這件事。

+1

那麼你想更新的攝像頭'對象'在哪裏?這不是一個'class'問題 - 你已經在某個地方實例化了一個對象,並且這個對象有你想要更新的這些成員。您基本上需要設計一種方法來獲取對象,無論是將其存儲爲全局單例模式等,然後訪問它。 – PaulMcKenzie

+0

Camera對象是在函數實例化(另一個類的),我還設置了回調和靜態函數mouseMoveCallback() – shaveenk

+0

我能夠通過使用全局變量和使用mouseMoveCallback()函數來更新,以獲得所需的功能全局變量,然後從非靜態成員函數中讀取更新的全局值。但是,當我想添加更多的參數來讀取時,如鍵盤輸入等,這可能會變得很難看。因此,我想知道是否有更好的方法來做到這一點 – shaveenk

回答

3

您可以使用glfwSet/GetWindowUserPointer到用戶定義的指針與GLFWwindow對象關聯。比方說,你create一個GLFWwindow指向winCamera指向的對象cam - 設置有:

... 
glfwSetWindowUserPointer(win, cam); 
glfwSetCursorPosCallback(win, mouseMoveCallback); 
... 

由於mouseMoveCallback從C庫調用,它具有C鏈接:

extern "C" void mouseMoveCallback (GLFWwindow *win, double x, double y) 
{ 
    // get the associated user-data: 
    Camera *cam = static_cast<Camera *>(glfwGetWindowUserPointer(win)); 

    // manipulate the associated Camera object: 
    ... 
} 
2

您的問題需要您決定哪個設計用於與您的對象實例進行通信。

一個設計可以創建窗口的全局的std ::地圖處理爲重點和對象實例的數據。當句柄進入時,您搜索窗口句柄的地圖,並可以從那裏檢索對象實例。

另一種設計是查看回調是否允許「用戶參數」。如果是這樣,那麼可以將指向實例的指針附加到用戶參數。當回調被調用時,您從「用戶參數」中檢索實例。

這些只是兩種方法。還有一些我不會提到,但可以通過搜索「爲'C'接口創建面向對象的包裝器」的方法進行研究。

+1

我只想補充一點,GLFW提供「用戶參數的」通過['glfwSetWindowUserPointer()'](http://www.glfw.org/docs/latest/group__window.html#ga3d2fc6026e690ab31a13f78bc9fd3651)的功能,所以它直接支持使用第二種方法。 – derhass