静态函数强制单例模式?

时间:2013-10-06 01:38:37

标签: c++ static singleton

这是情况。我正在使用一个库(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);
}

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

1 个答案:

答案 0 :(得分:2)

创建GLFW窗口时,使用glfwSetWindowUserPointer填充指向其中类的指针。在静态函数中,使用glfwGetWindowUserPointer将指针拉回,将其强制转换为适当类型的指针,然后调用相应的非静态方法。