2009-02-07 7 views
0

내가 세 개의 창 클래스, 각 OS에 대한 하나가 말 멀티 클래스에서 사용하기 위해 내가 지원하려는 :과부하. ->와 ::

  • WindowsWindow
  • OSXWindow
  • LinuxWindow

에게 그들은을 모두 클래스에서 상속됩니다. 이 클래스는 인스턴스화하는 클래스이기도합니다. Window 클래스에는. -> 및 :: 연산자가 오버로드되고 어떤 OS가 실행 중인지 (IFDEF에 따라)이 포인터를 관련 클래스에 캐스트합니다.

내가하고 싶은 일은 운영 체제가 실행되고 있는지에 대한 단서없이 Window 인스턴스를 만드는 것입니다. 이것은 매우 잘못된 생각입니까? 다운 캐스트가 위험한가요? 이 작업을 수행하는 더 좋은 방법이 있습니까?

실제로이 작업을 수행 할 라이브러리가 있음을 알고 있지만 직접 해보고 싶습니다.

가장 쉬운 방법은 공장을 만드는 것입니다. 하지만 이런 일을 할 수 있을까요?

답변

3

범위 해결 연산자 ::를 모두 오버로드 할 수 없습니다. -> 연산자를 오버로드 할 수는 있지만 해당 연산자를 호출 할 때 이미 필수 유형의 객체가 있어야합니다. 당신의 창을 만들 경우, 단순한 팩토리 메소드 사용하십시오 PIMPL에 대한 몇 가지 읽기 업을하고

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 관용구를 사용하는 것입니다. 팩토리는 Window 클래스와 WindowImpl 클래스의 두 클래스를 만듭니다. Window 클래스는 메서드 호출을 WindowImpl 클래스에 전달합니다. 클라이언트 코드는 팩토리에 윈도우를 요청하고, 팩토리는 어떤 구현 클래스를 사용할지를 (설정, 플랫폼 체크 등을 기반으로) 알고있다.

+0

을이 페이지를 발견 : http://en.wikipedia.org/wiki/Opaque_pointer 당신이 어떤에 대해 알고 다른/더 나은 페이지 또는 기사? – Mizipzor

+0

mizipzor : 4 권의 책. –

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