包含文件,typedef和forward decl

时间:2012-08-31 15:30:25

标签: c++ header-files

我有一个围绕win32 / pthreads的C ++线程包装器类。问题出现在我的标题中,我需要很多biggie-include,如windows.h和boost :: function,用于声明我的typedef。

这有什么办法吗?我知道你可以转发声明类和结构,但数据类型如命名空间中的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;

    };

由于

1 个答案:

答案 0 :(得分:1)

我认为这不是你真正的代码,因为我看不出包含在你的类定义中是如何工作的。

在这种情况下,您可能根本不想公开本机线程标识符。相反,提供抽象功能以理智的方式对线程进行操作,并且不会暴露实现细节,例如HANDLE。然后,您可以将包含移动到源文件并避免问题。

另请注意,在标头文件中执行WIN32_LEAN_AND_MEAN + #include <Windows.h>意味着某人不想WIN32_LEAN_AND_MEAN但在他们自己的windows.h之前包含您的标头意外地得到精益和平均。

编辑:我认为在标题中使用boost::function是好的,因为无论环境如何,包含总是相同的。只要您始终将其公开为Task而不是function本身,就可以将其视为界面的一部分。