Есть некий С++ класс, в нем есть интерфейс вызывающий внешний юзер-специфик коллбэк. Внутри этого коллбэка предполагается использование других интерфейсов указанного С++ класса(объекта) - как грамотно дать пользователю внешнего (не thiscall) мира возможность использовать интерфейсы С++ объекта внутри этого коллбэка? Пока вижу два варианта: 1. Объявить сам коллбэк с аргументом const CppClass& this_obj и обращаться уже через this_obj; 2. Предоставить пользователю самому возиться с объектом класса и самостоятельно перетаскивать его внутрь коллбэка; Как бы это сделать получше с учетом возможного ВНЕЗАПНОГО разрушения объекта (принудительное удаление, выход за пределы видимости)? Т.е. хочу что-то типа етого: Код (Text): typedef int (*user_callback_t)( void* arg ); class CMyClasss { user_callback_t usr_cbk = NULL; int iface_register( user_callback_t cbk ){ usr_cbk = cbk; } int MyClass_foo( void* arg ); ... }; int CMyClasss::MyClass_foo( void* arg ) { usr_cbk( arg ); } и чтобы затем юзер мог делать что-то вроде: Код (Text): CMyClasss obj; obj.iface_register( user_cbk ); int user_cbk( void* arg ) { obj.some_func(); .... } или Код (Text): int user_cbk( const CMyClasss& this_obj, void* arg ) { this_obj.some_func(); .... }
Не будет решением объявить колбэк виртуальной функцией и унаследовать класс? Правда динамически сменить колбэк не получится в этом случае.
Не пойдет наверное, слишком много работы пользователю и метод статический. Дело еще в том, что класс является контейнером для системных данных и вызовов и простое наследование не имеет смысла - нужно делать вызов нескольких интерфейсов чтобы "оживить" объект класса, запихнуть все в конструктор нельзя по определению. Т.е. тогда пользователю придется городить свой класс-наследник с инициализацией и т.п. а моя задача сделать standalone класс для общего пользования =)
в принципе наверное зря я напрягаюсь на тему ВНЕЗАПНОГО разрушения объекта =) коллбэк все равно ведь вызывается внутри интерфейса т.е. по идее объект должен быть жив в течение всего времени вызова. вроде так. т.е. вариант с user_cbk( const CMyClasss& this_obj, void* arg ) безопасен должен быть. если я не прав, поправьте....
NeuronViking Если экземпляр класса только один, можно сделать статический метод типа static CMyClass& instance() { return *this; } или как это правильно записать, и по мере надобности вызывать его из колбэка. Вопрос с безопасностью тот же, но, думаю, если нету многопоточности, проблем возникнуть не должно. Ведь нельзя же очистить память, отведенную под экземпляр класса, если в данный момент выполнение происходит в колбэке. Разве что в этом самом колбэке delete CMyClass::instance();.