2012-08-31 2 views
0

win32/pthreads 주위에 C++ 스레드 래퍼 클래스가 있습니다. 문제는 내 헤더에 biggie-like가 많이 필요하다. windows.h와 boost :: function은 아래에 내 typedef를 선언한다.파일, typedef 및 forward 포함 포함

이 문제가 발생합니까? 클래스와 구조체를 선언 할 수 있지만 네임 스페이스에서 win32 HANDLE 및 템플릿 함수와 같은 데이터 유형을 전달할 수 있다는 것을 알고 있습니다 ...?

#include "boost/function.hpp" 

    /* Thread wrapper class */ 
    class IThread 
    { 
    public: 
     #if defined _WIN32 || _WIN64 
      #define WIN32_LEAN_AND_MEAN 
      #include <Windows.h> 
      #undef WIN32_LEAN_AND_MEAN 
      typedef HANDLE ThreadHandle; 
     #else 
      #include <pthread.h> 
      typedef pthread_t ThreadHandle; 
     #endif 

     enum ThreadState 
     { 
      DETACHED = 0, 
      RUNNING, 
      FINISHED 
     }; 

     typedef boost::function1<void, void*> Task; 

     virtual ~IThread() { } 

     IThread& operator=(IThread& other); 
     virtual int32_t Join() = 0; 
     virtual int32_t SetPriority(int32_t priority) = 0; 

     virtual ThreadHandle& GetNativeHandle() = 0; 
     virtual ThreadState GetThreadState() const = 0; 

    }; 

감사

+0

'HANDLE'은 단지'void * '입니다. 그냥'typedef void * ThreadHandle;이라고 말하십시오. WINAPI 데이터 유형의 경우, 내 소스를 찾을 수 있습니다. [http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751 (v = vs. 85) .aspx). – chris

+0

클래스 외부에서 typedef를 이동할 수 없습니까? – Jaywalker

+0

그들은 왜 수업 외부에 있어야합니까? 클래스의 일부로 핸들을 선언하는 것이 더 합리적이지 않습니까? – KaiserJohaan

답변

1

은 내가 당신의 클래스 정의의 중간에 일할 수 포함하는 방법을 볼 수 없기 때문에이 실제 코드가 아닙니다 가정합니다.

이 경우 네이티브 스레드 식별자를 전혀 공개하지 않으려 고합니다. 대신, 스레드에 대해 작동 할 수있는 추상 기능을 제공하고 HANDLE과 같은 구현 세부 사항을 노출시키지 마십시오. 그런 다음 include를 소스 파일로 옮기고 문제를 피할 수 있습니다.

또한 헤더 파일에 WIN32_LEAN_AND_MEAN + #include <Windows.h>을 수행하는 것이 의미하는 것으로 WIN32_LEAN_AND_MEAN를 원하지만 windows.h 자신이 예기치 않게 린 앤 평균을 얻을 것이다 포함하기 전에 헤더를 포함하지 않는 사람.

편집 : 환경에 관계없이 항상 포함이 동일하기 때문에 헤더에 boost::function을 사용하는 것이 좋습니다. 항상 function 대신에 Task으로 노출되는 한 인터페이스의 일부로 간주 될 수 있습니다.

+0

부스트 :: 기능이란 무엇입니까? – KaiserJohaan