2009-02-07 11 views
0

Dire que j'ai trois classes de fenêtres, une pour chaque OS que je veux soutenir:Surcharge. -> et :: pour une utilisation dans les classes multi-plateformes

  • WindowsWindow
  • OSXWindow
  • LinuxWindow

Ils tous héritent de la classe Window. C'est aussi la classe que vous instanciez. La classe Window a le. -> et :: opérateurs surchargés, et selon le système d'exploitation (basé sur les IFDEF), il place le pointeur this dans la classe concernée.

Ce que je veux faire est juste de créer une instance de Windows sans aucune idée de ce que le système d'exploitation est en cours d'exécution. Cette pensée est-elle très mauvaise? Le downcast est-il dangereux? Y a-t-il de meilleurs moyens de le faire? Je suis conscient qu'il existe des bibliothèques pour faire cela, mais je veux l'essayer moi-même.

Je suppose que la façon la plus simple est de créer une usine. Mais peut-on faire quelque chose comme ça?

Répondre

3

Vous ne pouvez pas surcharger l'opérateur de résolution d'étendue :: du tout. Vous pouvez surcharger l'opérateur ->, mais lorsque vous appelez cet opérateur, vous devez déjà avoir un objet du type requis. Pour créer vos fenêtres, il suffit d'utiliser une méthode simple d'usine:

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

une fonction d'usine statique combinée avec des constructeurs privés; mon meilleur pari? – Mizipzor

1

Ce que vous devez probablement faire est d'avoir une méthode d'usine, et d'utiliser l'idiome PIMPL. Votre fabrique crée 2 classes - une classe Window et une classe WindowImpl. La classe Window transmet simplement les appels de méthode à la classe WindowImpl. Le code client demande à l'usine une fenêtre, et l'usine sait (en fonction de la configuration, des vérifications de la plate-forme, peu importe) quelle classe d'implémentation utiliser.

+0

faire une lecture sur le PIMPL, a trouvé cette page: http://en.wikipedia.org/wiki/Opaque_pointer savez-vous tout autres/meilleures pages ou articles? – Mizipzor

+0

mizipzor: Livre de Gang of Four. –

+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 –