>Вопрос по С++. Есть задача реализовать класс Handler, служащий для обработки некого >события. При создании этого класса необходимо указывать обработчик (в данном случае >это фунция exmpl_func). Как сделать, чтобы в качестве обработчика,при создании класса >Handler использовался метод другого класса (например метод Catcher::func()) > >#include <stdio.h> > >//////////////// >class Handler >{ >private: > void (*pointer)(); >public: > Handler() > { > pointer = 0; > }; > > Handler(void (*p)()) > { > pointer = p; > }; > > void peform(){ > if (pointer != 0) > pointer(); > }; > >}; > >/////////////// функция, используемая для обработки >void exmpl_func() >{ > printf("\nSome function."); >} > >/////////////// >class Catcher{ > Handler *handler; >public: > Catcher() > { > handler = new Handler(exmpl_func); > }; > > void func() // метод, что хотелось бы использовать > { > > }; > > void print() > { > printf("\nClass Catcher"); > if (handler != 0) > handler->peform(); > }; >}; > > > >void main() >{ > Catcher catcher; > catcher.print(); >} >Какие подобные механизмы можно использовать, чтобы это вписывалось в концепции ООП (например, >можно было бы в качестве параметра передавать сам объект, но как >учесть тот факт, что объекты могут быть разных классов). Поиогите хотя-бы >несколькими фпазами, что можно сделать. >Спасибо. Многоуважаемый, во-первых, зачем изобретать велосипед? Всё уже изобрели до нас: http://libsigc.sourceforge.net/ , а во-вторых, Символ какого-то класса это: RetType(ClassName::)(Params), а глобальная функция это: RetType(*)(Params). Существует возможность преобразования члена класса к RetType(*)(Params), но он должен быть СТАТИЧЕН! Иначе: test.cpp:16: error: invalid use of non-static member function `void* Test::XXX(void*)' test.cpp:16: error: invalid use of non-static member function Вот такие вот пироги с котятами. Если вы найдёте способ как это решить, то я буду очень благодарен если поделитесь.
|