#include <iostream>
using namespace std;
//GraphDevice.h
struct Application;
struct GraphDevice
{
friend struct Application;
struct Impl;
GraphDevice();
private:
void initialize();
Impl *impl;
};
//GraphDevice.cpp
struct GraphDevice::Impl
{
void initialize()
{
cout << "initialize!" << endl;
}
};
GraphDevice::GraphDevice()
{
impl = new Impl;
}
void GraphDevice::initialize()
{
impl->initialize();
}
//Application.h
struct Application
{
struct Impl;
Application();
void initialize();
private:
Impl *impl;
};
//Application.cpp
struct Application::Impl
{
GraphDevice *gd;
void initialize()
{
gd = new GraphDevice;
gd->initialize();
}
};
Application::Application()
{
impl = new Impl;
}
void Application::initialize()
{
impl->initialize();
}
//main.cpp
int main() {
Application app;
app.initialize();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy9HcmFwaERldmljZS5oCnN0cnVjdCBBcHBsaWNhdGlvbjsKc3RydWN0IEdyYXBoRGV2aWNlCnsKCWZyaWVuZCBzdHJ1Y3QgQXBwbGljYXRpb247CglzdHJ1Y3QgSW1wbDsKCUdyYXBoRGV2aWNlKCk7CnByaXZhdGU6Cgl2b2lkIGluaXRpYWxpemUoKTsKCUltcGwgKmltcGw7Cn07Ci8vR3JhcGhEZXZpY2UuY3BwCgpzdHJ1Y3QgR3JhcGhEZXZpY2U6OkltcGwKewoJdm9pZCBpbml0aWFsaXplKCkKCXsKCQljb3V0IDw8ICJpbml0aWFsaXplISIgPDwgZW5kbDsKCX0KfTsKCkdyYXBoRGV2aWNlOjpHcmFwaERldmljZSgpCnsKCWltcGwgPSBuZXcgSW1wbDsKfQoKdm9pZCBHcmFwaERldmljZTo6aW5pdGlhbGl6ZSgpCnsKCWltcGwtPmluaXRpYWxpemUoKTsKfQoKLy9BcHBsaWNhdGlvbi5oCnN0cnVjdCBBcHBsaWNhdGlvbgp7CglzdHJ1Y3QgSW1wbDsKCUFwcGxpY2F0aW9uKCk7Cgl2b2lkIGluaXRpYWxpemUoKTsKcHJpdmF0ZToKCUltcGwgKmltcGw7CQp9OwoKLy9BcHBsaWNhdGlvbi5jcHAKc3RydWN0IEFwcGxpY2F0aW9uOjpJbXBsCnsKCUdyYXBoRGV2aWNlICpnZDsKCXZvaWQgaW5pdGlhbGl6ZSgpCgl7CgkJZ2QgPSBuZXcgR3JhcGhEZXZpY2U7CgkJZ2QtPmluaXRpYWxpemUoKTsKCX0KfTsKCkFwcGxpY2F0aW9uOjpBcHBsaWNhdGlvbigpCnsKCWltcGwgPSBuZXcgSW1wbDsKfQoKdm9pZCBBcHBsaWNhdGlvbjo6aW5pdGlhbGl6ZSgpCnsKCWltcGwtPmluaXRpYWxpemUoKTsKfQoKLy9tYWluLmNwcAppbnQgbWFpbigpIHsKCUFwcGxpY2F0aW9uIGFwcDsKCWFwcC5pbml0aWFsaXplKCk7CglyZXR1cm4gMDsKfQ==