О данном случае: Проблема такая: для того, чтобы сделать мою программу кросс-платформенной, я выполнил уровень абстракции для операций, выполняемых операционной системой. Существует абстрактный базовый класс, называемый SystemComponent
, который выглядит примерно так:Как сделать абстрактный класс в объект Singleton?
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
затем impliments Отдельные функции ОС.
Чтобы создать компонент системы в Windows, я делаю это:
WindowsSytemComponent* pWSystemComp = new WindowSystemComponent();
//...
//And the pass a pointer to this to the crossplatform code like this
pFrameWork->SetSystem((SystemComponent*)pWSystemComp);
где структура делает вызовы к функциям операционной системы, указанных в SystemComponent
и передает указатель какого суб-классы нуждается.
Что нужно: Я хотел бы, чтобы удалить прохождение указателей, и сделать SystemComponent
класс и специфические функции операционной системы implimentations acsessible каждому объекту, который хочет использовать их. Лучший способ сделать это, чтобы сделать его Singleton, но ИСВНА я пытаюсь сделать что-то вроде
virtual static SystemComponent* Instance() { /*...*/ };
внутри SystemComponent
класса, который является абстрактным, я получаю ошибку компилятора, говоря такую вещь не допускается.
Как же тогда я должен идти?
Связанные: http://stackoverflow.com/questions/22998019/template-singleton-base-class-in-shared-object/22998472#22998472 –