Очень часто возникает ситуация, при которой объект, объявленный раньше, должен вызывать метод объекта, объявленного позже. Но поменять объявления местами не представляется возможным, ибо "нижестоящий" по коду ссылается на "вышестоящего".
Пример:
class foo |
| _Winnie C++ Colorizer |
При попытки скомпилировать это, компилятор пошлёт к такой-то матери. Ну и понятно, ведь на момент компиляции foo, нет никакой информации о bar. Это же не позволяет использовать обычные указатели на методы класса.
Можно попытаться выкрутиться, используя интерфейсы:
struct i_bar |
| _Winnie C++ Colorizer |
Данный код скомпилиться и будет работать. Но этот подход требует создание "костылей", что не радует глаз. К тому же нарушается иерархия. foo приходиться знать о bar, хотя знать о нём он не обязан. Всё что нужно - это вызов некой "абстрактной" функции/метода. А чья она - это уже не важно.
Можно "разнести" объявление и реализацию классов:
// bar.h |
| _Winnie C++ Colorizer |
Но раскидывать код по файлам не всегда бывает удобно. К тому же снова идёт нарушении иерархии, как в предидущем пункте. Но как бы то ни было, этот метод очень распространён. И я пользовался им до недавнего времени.
Пока не начала курить boost =)
typedef boost::function< void( const char * ) > boost_func; |
| _Winnie C++ Colorizer |
Вуаля! boost::bind + boost::function решает все проблемы. Раскидывать ничего не надо. К томуже foo не приходиться ничего знает о bar. Одни плюсы =)
Вот только я ещё не до конца понял, как это штука работает. Но работает - факт.