Отзыв составления мозаики OpenGL, не выполняющий

Я использовал примеры здесь перемещать мои отзывы составления мозаики в различный класс.

Кодекс собирает, но код отзыва никогда не выполняет.

Класс отзыва:

template 
class SingularCallBack
{
public:

    typedef ReturnType (Class::*Method)(Parameter);

    SingularCallBack(Class* class_instance, Method method)
        : class_instance_(class_instance),
        method_(method)
    {}

    ReturnType operator()(Parameter parameter)
    {
        return (class_instance_->*method_)(parameter);
    }

    ReturnType execute(Parameter parameter)
    {
        return operator()(parameter);
    }

private:

    Class* class_instance_;
    Method method_;
};

Отзывы:

void MyClass::tessBegin(GLenum which)
{
    glBegin(which);
    cout << "BEGIN CALLBACK IS WORKING";
}

void MyClass::tessVertex(const GLvoid *data)
{
   //cast back to double type
    const GLdouble *ptr = (const GLdouble*)data;

    glVertex3dv(ptr);
    cout << "VERTEX CALLBACK IS WORKING";
}

Функция составления мозаики, где я регистрирую их:

int MyClass::TessellatePolys()
{
    GLUtesselator *tess = gluNewTess();//create a tessellator
    if(!tess) return 0; //failed to create tessellation object, return 0

   //register callback functions
    SingularCallBack*BeginCallback;
    BeginCallback = new SingularCallBack(this,&GLOrtho::tessBegin);
    gluTessCallback(tess, GLU_TESS_BEGIN, (void (CALLBACK *)())BeginCallback);

    SingularCallBack*VertexCallback;
    VertexCallback = new SingularCallBack(this,&GLOrtho::tessVertex);
    gluTessCallback(tess, GLU_TESS_VERTEX, (void (CALLBACK *)())VertexCallback);

    ... (do tessellation) ...

    return id;
}

Что не так с путем отзывы регистрируются?

5
nl ja de
I' m, не видя, как кастинг указателя объекта на указатель функции, как предполагается, работает. Путем I' m чтение случается так, что tesselator попытается выполнить данные в BeginCallback:: class_instance _ , не dereference BeginCallback и пробег оператор() .
добавлено автор genpfault, источник
Отчасти. GLU tessellator является довольно старым кодом и doesn' t обращаются с объектами C++ путь you' попытка ре. Делая ваши отзывы просто простые функции C-sytle упростят много вещей. gluTessCallback man page имеет разумное обсуждение отзывов и что you' ll хотят включать в них (принимающий you' ре, знакомое с непосредственным стилем способа OpenGL).
добавлено автор radical7, источник
Я вижу что you' высказывание ре. Та часть была моей попыткой соответствовать этому решению (partow.net/programming/templatecallback) в код составления мозаики. Я приезжаю во всю вещь неправильно?
добавлено автор BrickFrog, источник

1 ответы

Вы бросаете указатель на тип объекта к указателю на тип функции (как, "BeginCallback" к "пустоте (ОТЗЫВ *) ()"). Эти типы несовместимы и не связаны. Кодекс собирает, поскольку это - бросок c-стиля без любой проверки типа. Еще больше с точки зрения компилятора C++ BeginCallback и VertexCallback - различные и несовместимые типы, и функция у gluTessCallback нет способности вызвать их перегруженного оператора() - это различные функции членства.

0
добавлено
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

pro.graphon (and gamedev)
pro.graphon (and gamedev)
389 участник(ов)

Обсуждаем стандарты консорциума Khronos: OpenGL, OpenCL и пр., предлагаем различные работы, туторы, интересные материалы по этим стандартам (и помечаем их тегами). Правила чата и инфо по системе тегов – /rules. Реклама только по согласованию с @AlexFails.

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest