这是情况。我正在使用一个库(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);
}
我还想到了存储一个指向静态向量中创建的每个类的指针的想法 - 然后在向量中的每个类上调用一个方法。但这也感觉不对。
答案 0 :(得分:2)
创建GLFW窗口时,使用glfwSetWindowUserPointer
填充指向其中类的指针。在静态函数中,使用glfwGetWindowUserPointer
将指针拉回,将其强制转换为适当类型的指针,然后调用相应的非静态方法。