#include <iostream>
class PublicClass
{
friend class PublicClassImpl;
int idx;
public:
PublicClass() : idx (42) {}
void DoWork();
};
// In the implementation file:
class PublicClassImpl
{
public:
static void DoWorkImpl(PublicClass& target);
};
void PublicClass::DoWork()
{
PublicClassImpl::DoWorkImpl(*this);
}
void PublicClassImpl::DoWorkImpl(PublicClass& target)
{
std::cout << "Index is currently " << target.idx++ << std::endl;
}
int main() {
PublicClass pc;
pc.DoWork();
pc.DoWork();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgUHVibGljQ2xhc3MKewoJZnJpZW5kIGNsYXNzIFB1YmxpY0NsYXNzSW1wbDsKCWludCBpZHg7CnB1YmxpYzoKCVB1YmxpY0NsYXNzKCkgOiBpZHggKDQyKSB7fQoJdm9pZCBEb1dvcmsoKTsKfTsKCi8vIEluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlOgpjbGFzcyBQdWJsaWNDbGFzc0ltcGwKewpwdWJsaWM6CiAgICBzdGF0aWMgdm9pZCBEb1dvcmtJbXBsKFB1YmxpY0NsYXNzJiB0YXJnZXQpOwp9OwoKdm9pZCBQdWJsaWNDbGFzczo6RG9Xb3JrKCkKewoJUHVibGljQ2xhc3NJbXBsOjpEb1dvcmtJbXBsKCp0aGlzKTsKfQoKdm9pZCBQdWJsaWNDbGFzc0ltcGw6OkRvV29ya0ltcGwoUHVibGljQ2xhc3MmIHRhcmdldCkKewoJc3RkOjpjb3V0IDw8ICJJbmRleCBpcyBjdXJyZW50bHkgIiA8PCB0YXJnZXQuaWR4KysgPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbigpIHsKCVB1YmxpY0NsYXNzIHBjOwoJcGMuRG9Xb3JrKCk7CglwYy5Eb1dvcmsoKTsKCXJldHVybiAwOwp9