将指向成员函数的指针作为指向函数的指针传递

时间:2011-12-21 17:03:13

标签: c++ callback sdl

所以情况就是这样:我正在使用C ++,SDL和GLConsole。我有一个班级SDLGame,其中包含Init()Loop()Render()等等 - 基本上,它为我的游戏类保留了逻辑。
到目前为止,GLConsole是一个不错的库 - 它允许我定义CVars等,甚至在我的SDL类中。但是,在定义命令时,我必须指定ConsoleFunc,其类型定义为

typedef bool (*ConsoleFunc)( std::vector<std::string> *args);

足够简单。但是,就像我说的,我的函数都在我的类中,我知道我不能将指向类的函数作为指针到函数的参数传递。我不能定义静态函数或在我的类之外创建函数,因为其中一些ConsoleFunc必须访问类数据成员才有用。我想保留OOP,因为 - 好吧,OOP很好。

嗯,我实际上已经解决了这个问题 - 但它非常难看。我只是将SDLGame的实例声明为extern变量,并在我的ConsoleFuncs / main类中使用它。

所以,问题是:有没有办法做到这一点,就像我这样做一样不愚蠢和愚蠢? (或者:是否有像GLConsole这样支持SDL的控制台库,可以做我正在描述的内容?)

1 个答案:

答案 0 :(得分:7)

如果您拥有的唯一界面是该功能指针,那么您就搞砸了。

成员函数需要一个this指针才能被调用,如果你无法通过它,那你就不走运了(我想std::vector<std::string>* args指针就是你传递的指针图书馆)。

换句话说,即使该库使用C ++容器,它也不是一个好的C ++库,因为它依赖于免费函数来进行回调。一个好的C ++库会使用boost::function或类似的东西,或者至少让你传递一个void* user_data指针,它会被传递给你的回调。如果你有这个,你可以传递你的类的this指针,将它转回回调内部,并调用相应的成员函数。