我正在开发一个游戏项目,该项目具有渲染到 opengl 上下文中的临时构建控件;诸如按钮、滚动条、列表框等之类的东西。其中许多控件是嵌套的;例如,我的列表框有一个滚动条,一个滚动条有 3 个按钮,等等。
当滚动条更改值时,我希望它调用响应更改的“某些”函数(通常在它的父对象中)。例如,如果列表框有一个滑块,它应该实例化滑块,然后告诉新滑块它应该调用列表框的“onScroll(float)”函数。所有控件共享一个公共基类,所以我可以有一个“base* parent”父指针,然后执行“parent->onScroll(val)”。但问题是当父母没有从基地继承时会发生什么;没有虚拟的 onScroll() 可以执行,因此顶级父级必须定期检查是否有任何子控件更改了值。这也会混淆其他控件,因为它们甚至可能没有孩子,
更好的解决方案是让子对象维护一个通用函数指针(如回调),它可以由父对象设置,并在必要时由子对象调用。像这样的东西:
typedef (*ptFuncF)(float);
class glBase {
public:
//position,isVisible,virtual mouseDown(x,y),etc
};
class glDerivedChild : public glBase {
public:
glDerivedChild();
~glDerivedChild();
void changeValue(float fIn) {
Value = fIn; //ignore these forward declaration errors
(*callBack)(fIn);
}
void setCallBack(ptFuncF pIn) {callBack = pIn;}
ptFuncF callBack;
float Value;
};
class glDerivedParent : public glBase {
public:
glDerivedParent() {
child = new glDerivedChild();
child->setCallBack(&onScroll);
}
~glDerivedParent() {delete child;}
void onScroll(float fIn) {
//do something
}
glDerivedChild* child;
};
class someFoo {
public:
someFoo() {
child->setCallBack(&setValue);
}
void setValue(float fIn) {
//do something else
}
glDerivedChild child;
};
我对函数指针有点陌生,所以我知道我(显然)做错了很多事情。我怀疑它可能涉及“typedef (glBase::*ptFuncF)(float);”之类的东西 'onScroll(f)' 是一个被覆盖的虚函数,可能具有像'virtual void childCallBack(float)' 这样的通用名称。我更愿意让解决方案尽可能接近原版,所以我想避免像 boost 这样的外部库。在 8 小时的大部分时间里,我一直在摸索这个问题,我希望有人能提供帮助。谢谢!