Как грамотно разрулить такое?

Тема в разделе "LANGS.C", создана пользователем NeuronViking, 23 июн 2010.

  1. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    Есть некий С++ класс, в нем есть интерфейс вызывающий внешний юзер-специфик коллбэк. Внутри этого коллбэка предполагается использование других интерфейсов указанного С++ класса(объекта) - как грамотно дать пользователю внешнего (не thiscall) мира возможность использовать интерфейсы С++ объекта внутри этого коллбэка?
    Пока вижу два варианта:

    1. Объявить сам коллбэк с аргументом const CppClass& this_obj и обращаться уже через this_obj;
    2. Предоставить пользователю самому возиться с объектом класса и самостоятельно перетаскивать его внутрь коллбэка;

    Как бы это сделать получше с учетом возможного ВНЕЗАПНОГО разрушения объекта (принудительное удаление, выход за пределы видимости)?

    Т.е. хочу что-то типа етого:

    Код (Text):
    1. typedef int (*user_callback_t)( void* arg );
    2.  
    3. class CMyClasss {
    4.        user_callback_t  usr_cbk = NULL;
    5.        int iface_register( user_callback_t cbk ){
    6.             usr_cbk = cbk;
    7.        }
    8.        int MyClass_foo( void* arg );
    9.        ...
    10. };
    11.  
    12. int CMyClasss::MyClass_foo( void* arg ) {
    13.      usr_cbk( arg );
    14. }
    и чтобы затем юзер мог делать что-то вроде:

    Код (Text):
    1. CMyClasss obj;
    2.  
    3. obj.iface_register( user_cbk );
    4.  
    5.  
    6. int user_cbk( void* arg )
    7. {
    8.       obj.some_func();
    9.       ....
    10. }
    или

    Код (Text):
    1. int user_cbk( const CMyClasss& this_obj, void* arg )
    2. {
    3.       this_obj.some_func();
    4.       ....
    5. }
     
  2. google

    google New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2007
    Сообщения:
    140
    Не будет решением объявить колбэк виртуальной функцией и унаследовать класс? Правда динамически сменить колбэк не получится в этом случае.
     
  3. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    Не пойдет наверное, слишком много работы пользователю и метод статический. Дело еще в том, что класс является контейнером для системных данных и вызовов и простое наследование не имеет смысла - нужно делать вызов нескольких интерфейсов чтобы "оживить" объект класса, запихнуть все в конструктор нельзя по определению. Т.е. тогда пользователю придется городить свой класс-наследник с инициализацией и т.п. а моя задача сделать standalone класс для общего пользования =)
     
  4. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    в принципе наверное зря я напрягаюсь на тему ВНЕЗАПНОГО разрушения объекта =) коллбэк все равно ведь вызывается внутри интерфейса т.е. по идее объект должен быть жив в течение всего времени вызова. вроде так. т.е. вариант с user_cbk( const CMyClasss& this_obj, void* arg ) безопасен должен быть. если я не прав, поправьте....
     
  5. google

    google New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2007
    Сообщения:
    140
    NeuronViking
    Если экземпляр класса только один, можно сделать статический метод типа static CMyClass& instance() { return *this; } или как это правильно записать, и по мере надобности вызывать его из колбэка. Вопрос с безопасностью тот же, но, думаю, если нету многопоточности, проблем возникнуть не должно. Ведь нельзя же очистить память, отведенную под экземпляр класса, если в данный момент выполнение происходит в колбэке. Разве что в этом самом колбэке delete CMyClass::instance();.
     
  6. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    это было бы круто даже для индусов! =)))
     
  7. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    150 просмотров и ни одного варианта. все такие стеснительные чтоли? =)
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    константая ссылка самый простой и удобный метод.
    хотя если объект сиглтон, то можно проще сделать.