我有一个头文件(我们称它为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文件中“删除”了声明和宏?
答案 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();
}