#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;
}