1. C++ / Говнокод #14395

    +10

    1. 1
    typedef boost::shared_ptr<LPDIRECT3D9> Direct3dShared;

    Те кто знают, что такое в гейдеве LPDIRECT3D9 и IDirect3D9 - поймут.
    Думаю сегодня даже не нужно писать с какого это сайта.

    Запостил: LispGovno, 22 Января 2014

    Комментарии (13) RSS

    • Ответить
    • Эм, умный указатель на... глупый указатель?
      Ответить
      • Я тебе даже больше скажу IDirect3D9 - COM интерфейс со счетчиком ссылок.
        LPDIRECT3D9 - соответственно глупый указатель на интерфейс.
        Ответить
        • А можно увидеть код, в котором автор создает инстанс и сует результат в переменную типа Direct3dShared? Он тоже должен быть веселым...

          UPD: А при обращении к методам интерфейса он пишет что-то типа (*d3d)->someFunction()? :)
          Ответить
          • Хрен его знает. Автор топика сильно быстро написал, что ответ найден и закрыл тему. Писал что у него что-то там не удалялось.
            Ответить
            • Кстати, а чего в бусте православно юзать для COM интерфейсов?

              boost::intrusive_ptr?
              Ответить
              • Не думал на эту тему. Возможно да. Но придется дописать пару функций. У меня CococomPtr есть самописный.
                Ответить
                • Ну свой то велосипедный ко::ко::ком_птр на пару десятков строчек само собой можно накатать. Просто я думал, может там какой-то штатный boost::com_ptr завалялся...

                  А пару функций же можно написать всего один раз, или мне пора спать?
                  template <class T> void intrusive_ptr_add_ref(T *p) {
                      p->AddRef();
                  }
                  template <class T> void intrusive_ptr_release(T *p) {
                      p->Release();
                  }
                  Ответить
                  • Ну интрусив птр же сам не удаляет объекты? Похоже тогда все верно.
                    Ответить
                    • > Ну интрусив птр же сам не удаляет объекты?
                      Да, он всю работу сваливает на эти джве функции.

                      Траблы пока такие вижу:
                      - COM объекты рождаются со 1 на счетчике, поэтому надо не забывать передавать false в конструктор intrusive_ptr;
                      - С QueryInterface непонятки: в своем то классе можно запилить его как оператор приведения типа, а тут - куй, придется делать внешний хелпер.
                      Ответить
                      • > как оператор приведения типа
                        Но для этого нужен способ для выяснения IID'а по интерфейсу. Изкоробки его вроде нет?
                        Ответить
                  • > штатный boost::com_ptr
                    Ну, буст же кроссплатформенен, в отличие от СОМ, я б предположил, что нет там такого. Зато есть замечательный Microsoft::WRL::ComPtr в составе vs2012.
                    Но ведь это же геймдев, не написать свой dx_ptr - кощунство, сам таких три версии писал :)
                    Ответить
    • я не знаю, что это, но я подозреваю, что LP - это таки указатель
      и делать шаредптр указателя это неплохо, неплохо

      ps. а, борманд уже настрочил)
      Ответить

    Добавить комментарий