class Consumer {
public:
virtual void consume(int data) = 0;
};
class A {
public:
A() {}
void attachConsumer(Consumer* consumer) { consumer_ = consumer; }
void process(int data) {
// must always check consumer_ here!
consumer_->consume(data); }
private:
Consumer* consumer_;
};
class B : public Consumer {
public:
B() {}
void consume(int data) { /* consume data */ }
};
int main() {
A a_ = A();
// ... for reasons I won't tell you, B must be created later than A ...
B* b_ = new B();
a_.attachConsumer(b_);
a_.process(5);
return 0;
}
ICAgIGNsYXNzIENvbnN1bWVyIHsKICAgIHB1YmxpYzoKICAgICAgICB2aXJ0dWFsIHZvaWQgY29uc3VtZShpbnQgZGF0YSkgPSAwOwogICAgfTsKCiAgICBjbGFzcyBBIHsKICAgIHB1YmxpYzoKICAgICAgICBBKCkge30KICAgICAgICB2b2lkIGF0dGFjaENvbnN1bWVyKENvbnN1bWVyKiBjb25zdW1lcikgeyBjb25zdW1lcl8gPSBjb25zdW1lcjsgfQogICAgICAgIHZvaWQgcHJvY2VzcyhpbnQgZGF0YSkgewogICAgICAgICAgICAvLyBtdXN0IGFsd2F5cyBjaGVjayBjb25zdW1lcl8gaGVyZSEKICAgICAgICAgICAgY29uc3VtZXJfLT5jb25zdW1lKGRhdGEpOyB9CiAgICBwcml2YXRlOgogICAgICAgIENvbnN1bWVyKiBjb25zdW1lcl87CiAgICB9OwogICAgCiAgICBjbGFzcyBCIDogcHVibGljIENvbnN1bWVyIHsKICAgIHB1YmxpYzoKICAgICAgICBCKCkge30KICAgICAgICB2b2lkIGNvbnN1bWUoaW50IGRhdGEpIHsgLyogY29uc3VtZSBkYXRhICovIH0KICAgIH07CgoJaW50IG1haW4oKSB7CgkgICAgQSBhXyA9IEEoKTsKICAgICAgICAvLyAuLi4gZm9yIHJlYXNvbnMgSSB3b24ndCB0ZWxsIHlvdSwgQiBtdXN0IGJlIGNyZWF0ZWQgbGF0ZXIgdGhhbiBBIC4uLgoJICAgIEIqIGJfID0gbmV3IEIoKTsKCSAgICBhXy5hdHRhY2hDb25zdW1lcihiXyk7CgkgICAgYV8ucHJvY2Vzcyg1KTsKCSAgICByZXR1cm4gMDsKCX0=