簡體   English   中英

在C ++中更新靜態函數中的非靜態成員

[英]Updating non-static members in a static function in C++

我試圖根據我在OpenGL中的鼠標移動來更新相機的參數。 我正在使用GLFW。 GLFW中有一個預定義的事件處理程序

glfwSetCursorPosCallback(window, mouseMoveCallback);

我正在用來注冊mouseMoveCallback()函數。 我已經在一個類中聲明了我的Camera,並且在程序中使用了Camera類的實例。 Camera類中的成員是非靜態的,但是mouseMoveCallback函數是靜態的。 我知道靜態函數不可能訪問非靜態成員。 更新Camera類的非靜態實例的成員的最佳方法是什么?

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

您可以使用glfwSet / GetWindowUserPointer將用戶定義的指針與GLFWwindow對象相關聯。 假設您創建一個由win指向的GLFWwindow和一個由cam -setup指向的Camera對象:

...
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:
    ...
}

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

一種設計可能是創建一個全局的窗口句柄std :: map作為鍵,將對象實例作為數據。 當手柄進入時,您可以在地圖上搜索窗口手柄,然后可以從那里檢索對象實例。

另一種設計是查看回調是否允許“用戶參數”。 如果是這樣,則可以將實例的指針附加到用戶參數。 調用回調時,將從“用戶參數”中檢索實例。

這只是兩種方法。 還有其他一些我不會提到的東西,但是可以通過搜索“為'C'接口制作面向對象的包裝器”的方法來進行研究。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM