2009-02-07 7 views
0

у меня есть три класса окна, по одному для каждой ОС я хочу поддержать:Перегрузка. -> и :: для использования в мультиплатформенных классах

  • WindowsWindow
  • OSXWindow
  • LinuxWindow

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

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

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

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

ответ

3

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

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 
    } 
}; 
+0

статическая заводская функция объединена с частными конструкторами; мой лучший выбор? – Mizipzor

1

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

+0

делают некоторые чтения вверх на Pimpl, нашел эту страницу: http://en.wikipedia.org/wiki/Opaque_pointer вы знаете о каких-либо другие/лучшие страницы или статьи? – Mizipzor

+0

mizipzor: Банда четырех книг. –

+0

http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612/ref=pd_bbs_sr_1?ie=UTF8&s=books&qid=1234024135&sr=8-1 –