2013-01-09 39 views
5

निष्पादित नहीं किया गया मैंने अपने टेस्सेलेशन कॉलबैक को एक अलग वर्ग में स्थानांतरित करने के लिए उदाहरण here का उपयोग किया।ओपनजीएल टेस्सेलेशन कॉलबैक

कोड संकलित करता है, लेकिन कॉलबैक कोड कभी निष्पादित नहीं होता है।

कॉलबैक वर्ग:

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; 
} 

क्या तरीका कॉलबैक पंजीकृत किया जा रहा है साथ कुछ गड़बड़ है ?

+0

मैं नहीं देख रहा हूं कि फ़ंक्शन पॉइंटर को ऑब्जेक्ट पॉइंटर कास्टिंग कैसे करना है। जिस तरह से मैं इसे पढ़ रहा हूं वह यह है कि टेस्सेलेटर 'BeginCallback :: class_instance_' में डेटा निष्पादित करने का प्रयास करेगा,' BeginCallback' को अस्वीकार नहीं करेगा और 'ऑपरेटर()' चलाएं। – genpfault

+9

मैं देख रहा हूँ कि आप क्या कह रहे हैं। वह हिस्सा टेसेलेशन कोड में इस समाधान (http://www.partow.net/programming/templatecallback/) को फिट करने का मेरा प्रयास था। क्या मैं पूरी बात गलत तरीके से आ रहा हूं? – BrickFrog

+1

की तरह। जीएलयू टेस्सेलेटर पुराना कोड है, और जिस तरह से आप कोशिश कर रहे हैं, सी ++ ऑब्जेक्ट्स को संभाल नहीं लेता है। अपने कॉलबैक को सरल बनाना सी-सिटल फ़ंक्शन कई चीजों को सरल बना देगा। ['GluTessCallback' मैन पेज] (http://www.opengl.org/sdk/docs/man2/xhtml/gluTessCallback.xml) में कॉलबैक की उचित चर्चा है और आप उनमें क्या शामिल करना चाहते हैं (मानते हुए आप तत्काल-मोड-स्टाइल ओपनजीएल से परिचित हैं)। – radical7

उत्तर

0

आप किसी ऑब्जेक्ट प्रकार को पॉइंटर को किसी फ़ंक्शन प्रकार (जैसे "BeginCallback" को "शून्य (कॉलबैक *)()") में पॉइंटर कास्टिंग कर रहे हैं। ये प्रकार असंगत और असंबंधित हैं। कोड संकलित करता है क्योंकि यह किसी भी प्रकार की जांच के बिना सी-स्टाइल कास्ट है। सी ++ कंपाइलर बिंदु से, और भी, StartCallback और VertexCallback अलग-अलग और असंगत प्रकार हैं और फ़ंक्शन gluTessCallback में उनके अधिभारित ऑपरेटर() को कॉल करने की कोई क्षमता नहीं है - ये अलग-अलग सदस्य कार्य हैं।