gpt4 book ai didi

c++ - OpenGL 曲面 segmentation 回调未执行

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:43 25 4
gpt4 key购买 nike

我使用了示例 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;
}

回调的注册方式有什么问题?

最佳答案

您正在将指向对象类型的指针转​​换为指向函数类型的指针(例如,“BeginCallback”转换为“void (CALLBACK *)()”)。这些类型不兼容且不相关。代码编译为 c 风格转换,没有任何类型检查。更重要的是,从 C++ 编译器的角度来看,BeginCallback 和 VertexCallback 是不同且不兼容的类型,函数 gluTessCallback 无法调用它们的重载 operator() - 这些是不同的成员函数。

关于c++ - OpenGL 曲面 segmentation 回调未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14244406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com