是否可以删除特定文件的声明和宏?

时间:2018-12-06 19:45:37

标签: c++

我有一个头文件(我们称它为Window.h),看起来像这样:

#include <windows.h>

class Window {
    Window();
    HWND hwnd;
}

要在另一个文件(例如Main.cpp)中使用此类,必须包含Window.h:

#include "Window.h"

问题是我不希望Main.cpp包含windows.h,因为windows.h在我不想包含在Main.cpp中的命名空间之外添加了许多宏和新的声明。我不能将windows.h移到Window.h的实现(Window.cpp),因为该类具有HWND属性。

我唯一能想到的解决方法是将hwnd声明为指针:

void* hwnd;

但是我不喜欢这种方法。如果您经常这样做,事情可能会变得非常混乱。有没有更好的方法可以做到这一点,也许是从Main.cpp文件中“删除”了声明和宏?

1 个答案:

答案 0 :(得分:5)

不,您不能“删除”声明,但是可以通过两种方式将其隐藏: 1.Impl-Pimpl习语

//.h file
class Window {
   class Impl;
   Impl* pImpl;
   Window();
   ~Window();
   void doSomething();
};


//.cpp file
#include <windows.h>

struct Window::Impl
{
   HWND hwnd;
};

Window::Window()
{
   pImpl = new Window::Impl;
}

Window::~Window()
{
   delete pImpl;
}

void Window::doSomething()
{
   //foo(pImpl->hwnd);
}

2.Abstract类。

//.h file
class Window
{
public:
   static Window* newWindow();
   virtual void doSomething() = 0;
   virtual ~Window() {};
};

//.cpp file
#include <windows.h>

class WindowImpl : public Window
{
   HWND hwnd;
   void Window::doSomething() override
   {
      //foo(pImpl->hwnd);
   }
};


Window* Window::newWindow()
{
   return new WindowImpl();
}