情况是什么:
问题是这样的-为了使我的程序跨平台,我为操作系统执行的操作做了一个抽象层。有一个称为SystemComponent的抽象基类,它看起来像这样:

class SystemComponent{
public:
    //some functions related to operations for OS
    virtual WindowHandle CreateNewWindow(/*...*/) = 0;
    virtual void Show_Message(/*...*/)            = 0;
    //...
}


然后由另一个特定于操作系统的类继承,例如Windows的WindowsSystemComponent

#ifdef _WIN23

class WindowsSystemComponent   :   SystemComponent{
public:
    virtual WindowHandle CreateNewWindow(/*...*/);
    virtual void Show_Message(/*...*/);
    //...
protected:
    //Windows specific things...
}

#endif


然后,此WindowsSystemComponent隐含OS特定的功能。

要在Windows中创建系统组件,请执行以下操作:

WindowsSytemComponent* pWSystemComp = new WindowSystemComponent();
//...
//And the pass a pointer to this to the crossplatform code like this
pFrameWork->SetSystem((SystemComponent*)pWSystemComp);


其中框架调用SystemComponent中指定的OS函数,并将指针传递给子类需要的任何指针。

需要什么:
我想删除指针的传递,并使要使用它们的每个对象都可以访问SystemComponent类和特定于OS的Function隐含方法。最好的方法是使它成为Singleton,但是我试图做类似的事情

virtual static SystemComponent* Instance() { /*...*/ };


SystemComponent类的内部,这是抽象的,我得到一个编译器错误,说不允许这样做。

那我该怎么办呢?

最佳答案

您不能使用虚拟的静态方法,但是Instance方法不必是虚拟的-它只需要为您所运行的平台创建正确的SystemComponent即可。您只需要获取现在使用的代码即可为平台创建SystemComponent实例并将其放入Instance方法中。

10-08 07:55