Здравствуйте, bada, Вы писали:
B>imho, на лицо некоторое непонимание основ.
Просто человек хочет сказать, что калбэки можно реализовать при помощи функторов, а можно при помощи интерфейсов. При помощи интерфейсов это выглядит так:
При помощи интерфейсов:
class CallbackInterface
{
public:
virtual void do_call() = 0;
};
class ComeClass // Класс, который инициирует событие
{
CallbackInterface * cbi;
void do_something()
{
//
if (cbi) cbi->do_call(); // инициируем событие
//
}
public:
void set_call_back_obj(CallbackInterface * cbi)
{
this->cbi = cbi;
}
};
class Eventhandler : public /* или protected (чтобы не нарушать принцип Лисков)*/ CallbackInterface
{
void init_events()
{
// Указываем, что обработчиком события явсляется наш объект
some_class.set_call_back_obj(this);
}
private:
// Обработчик события
virtual void do_call()
{
}
};
При помощи функторов:
class ComeClass
{
void do_something()
{
//
event(); // инициируем событие
//
}
public:
boost::signal<void()> event;
};
class Eventhandler
{
boost::signals::scoped_connection scp_conn;
void init_events()
{
// Указываем, что обработчиком события является this->do_event
scp_conn = some_class.event.connect( boost::bind(&Eventhandler::do_event, this) );
}
private:
// Обработчик события
void do_event()
{
}
};
Причём в последнем случае при помощи boost::signals::scoped_connection, объект отпишется от события после удаления автоматически. IMHO даже по объёму кдоа и читабельности делегаты (функторы) лучше
... << RSDN@Home 1.1.4 stable rev. 510>>