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);
}

我还玩弄了存储指向在静态向量中创建的每个类的指针的想法 - 然后在向量中的每个类上调用一个方法。但这也感觉不对。

4

1 回答 1

2

创建 GLFW 窗口时,使用glfwSetWindowUserPointer. 在您的静态函数中,使用 将该指针拉出glfwGetWindowUserPointer,将其转换回适当类型的指针,然后调用适当的非静态方法。

于 2013-10-06T01:42:04.093 回答