Я пишу простую библиотеку для обработки окон на разных платформах. Чтобы абстрагировать код, определяющий платформу c, я хочу использовать идиому PImpl с std :: unique_ptr и предоставить частную реализацию спецификации платформы c с фабричной функцией. Вот что у меня сейчас:
Window.h:
#pragma once
#include <memory>
class Window
{
public:
Window();
~Window();
private:
class WindowImpl;
std::unique_ptr<WindowImpl> impl;
};
Window. cpp:
#include "Window.h"
#include "WindowImpl.h"
Window::Window() : impl(WindowImpl::create()) {}
Window::~Window() = default;
WindowImpl.h:
#include "Window.h"
#include <memory>
class Window::WindowImpl
{
public:
static std::unique_ptr<WindowImpl> create();
};
WindowImpl. cpp:
#include "WindowImpl.h"
std::unique_ptr<Window::WindowImpl> Window::WindowImpl::create()
{
// the plan is to return the platform specific WindowImpl implementation here
return std::make_unique<Window::WindowImpl>();
}
Это, кажется, делает то, что я хочу , Моя проблема заключается в том, что в настоящее время я должен указать " Window :: " перед всем, что есть в WindowImpl. cpp. Поскольку Window является классом, а не пространством имен, «использование Window» не работает. Все примеры, которые я нашел об этой топике c, имеют полное определение класса Impl внутри исходного файла своего класса, используя его, и поэтому не имеют этой проблемы. Но мне нужно иметь WindowImpl в отдельном заголовке, если я хочу извлечь из него реализации платформы c.
Есть ли способ сохранить WindowImpl в своем собственном заголовочном / исходном файле и избавиться от него? многословие?