2013-10-06 75 views
1

這是情況。我正在使用一個庫(GLFW),它具有一些回調函數,您可以設置它們以接收各種東西(錯誤,窗口大小更改等)的通知。這些功能必須是靜態的。爲了將這些數據返回到類的「非靜態」實例,我不得不讓它們變成單例。有沒有更好的/替代的方法來處理類中的強制靜態函數?靜態函數強制單例模式?

這裏是最好的,我拿出這麼遠:

//OpenGlTest.h 
#pragma once 

#include "glfw.h" 

#pragma comment(lib,"opengl32.lib") 
#pragma comment(lib,"glfw3dll.lib") 

class OpenGlTest 
{ 
public: 
    static OpenGlTest& GetInstance(); 

private: 
    OpenGlTest(void); 
    ~OpenGlTest(void); 

public: 

    void Initialize(void); 

    static void stError(int iError, const char* sMessage); 
    void onError(int iError, const char* sMessage); 
}; 


//OpenGlTest.cpp 
#include "stdafx.h" 
#include "OpenGlTest.h" 

OpenGlTest::OpenGlTest(void) 
{ } 

OpenGlTest::~OpenGlTest(void) 
{ } 

OpenGlTest& OpenGlTest::GetInstance() 
{ 
    static OpenGlTest stOpenGlTest; 
    return stOpenGlTest; //RETURN SINGLE INSTANCE 
} 

void OpenGlTest::Initialize(void) 
{ 
    glfwInit(); 
    glfwSetErrorCallback(stError); 
} 

void OpenGlTest::onError(int iError, const char* sMessage) 
{ 
    //YAY WE ARE NOT STATIC! 
} 

void OpenGlTest::stError(int iError, const char* sMessage) 
{ 
    // BOO - THERE HAS TO BE ANOTHER WAY :(
    GetInstance().onError(iError, sMessage); 
} 

我還保存一個指向一個靜態向量創建的每個類的想法玩弄 - 然後調用每個類中的方法在向量中。但那也只是感覺不對。

回答

2

創建GLFW窗口時,使用glfwSetWindowUserPointer填充指向您班級的指針。在您的靜態函數中,使用glfwGetWindowUserPointer將該指針拉回,將其轉回到適當類型的指針,並調用相應的非靜態方法。

+0

太棒了 - 這將有助於與窗口相關的回調。但是在沒有窗口句柄(錯誤/輸入)的情況下調用呢? – cschear

+0

@cschear:GLFW似乎以全局方式處理錯誤。我不知道它的錯誤有多嚴重,但如果它們處於嚴重的一面,你可能只想打印一條消息並退出。至於輸入,文檔說*有*窗口指針。 – icktoofay

+0

啊,你說得對。我還沒有開始處理輸入。感謝您的幫助 - 我從來沒有發現這一點。 – cschear