Перегрузка -> и :: для использования в мультиплатформенных классах - PullRequest
0 голосов
/ 07 февраля 2009

Допустим, у меня есть три класса окон, по одному для каждой ОС, которые я хочу поддерживать:

  • WindowsWindow
  • OSXWindow
  • LinuxWindow

Все они наследуются от класса Window . Это также класс, который вы создаете. Класс Window имеет свой. -> и :: операторы перегружены, и в зависимости от того, на какой ОС работали (на основе IFDEF), он приводит указатель this к соответствующему классу.

Что я хочу сделать, это просто создать экземпляр Window без какой-либо подсказки о том, какая ОС работает. Это неправильное мышление? Опасен ли опасный? Есть ли лучшие способы сделать это?

Я знаю, что для этого есть библиотеки, но я хочу попробовать это сам.

Полагаю, самый простой способ - создать фабрику. Но можно ли что-то подобное сделать?

Ответы [ 2 ]

3 голосов
/ 07 февраля 2009

Вы не можете перегрузить оператор разрешения области :: вообще. Вы можете перегрузить оператор ->, но когда вы вызываете этот оператор, у вас уже должен быть объект требуемого типа. Для создания ваших окон просто используйте простой фабричный метод:

class Window
{
public:
    static Window *CreateWindow(...)
    {
#ifdef _WIN32
        return new Win32Window(...);
#elif defined(/** whatever is defined for Linux */)
        return new X11Window(...);
#elif defined(/** whatever is defined for Mac */)
        return new CocoaWindow(...);
#else
#error "Bad platform!"
#endif
    }
};
1 голос
/ 07 февраля 2009

Что вам, вероятно, следует сделать, это использовать фабричный метод и использовать идиому PIMPL. Ваша фабрика создает 2 класса - класс Window и класс WindowImpl. Класс Window просто перенаправляет вызовы метода в класс WindowImpl. Код клиента запрашивает у фабрики окно, и фабрика знает (на основе конфигурации, проверок платформы и т. Д.), Какой класс реализации использовать.

...