#include <iostream>

class SubjectClass
{
public:
	std::size_t id() const
	{
		std::clog << "Id: " << this << std::endl;
		return reinterpret_cast<std::size_t>(this);
	}
};

class Foo
{
	SubjectClass * m_subject;
	
public:
	explicit Foo(SubjectClass * subject)
	 : m_subject(subject)
	{}
	
	std::size_t id() const
	{
		std::clog << "SubjectsId: " << this->m_subject << std::endl;
		return reinterpret_cast<std::size_t>(this->m_subject);
	}
	
	void doShitOnWholeProgramm()
	{
		Foo f2(this->m_subject);
		
		std::cout << "InnerSame: " << (f2.id() == this->id()) << std::endl;
	}
};

// Gleiche Ebene hier
int main()
{
	SubjectClass subject;
	Foo f(&subject);
	
	// ...
	f.doShitOnWholeProgramm();
	// ...
	
	std::cout << "Same: " << (f.id() == subject.id()) << std::endl;
	
	return 0;
}
