5

ここの例を使用して、テッセレーション コールバックを別のクラスに移動しました。

コードはコンパイルされますが、コールバック コードは実行されません。

コールバック クラス:

template <class Class, typename ReturnType, typename Parameter>
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<GLOrtho, void, GLenum>*BeginCallback;
    BeginCallback = new SingularCallBack<GLOrtho, void, GLenum>(this,&GLOrtho::tessBegin);
    gluTessCallback(tess, GLU_TESS_BEGIN, (void (CALLBACK *)())BeginCallback);

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

    ... (do tessellation) ...

    return id;
}

コールバックの登録方法の何が問題になっていますか?

4

1 に答える 1

0

オブジェクト型へのポインターを関数型へのポインターにキャストしています (「BeginCallback」から「void (CALLBACK *)()」など)。これらのタイプは互換性がなく、関連もありません。コードは、型チェックなしで c スタイルのキャストとしてコンパイルされます。さらに、C++ コンパイラの観点からは、BeginCallback と VertexCallback は異なり、互換性のない型であり、関数 gluTessCallback にはオーバーロードされた operator() を呼び出す機能がありません。これらは異なるメンバー関数です。

于 2013-11-13T20:55:23.317 に答える