所以情况就是这样:我正在使用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的控制台库,可以做我正在描述的内容?)
答案 0 :(得分:7)
如果您拥有的唯一界面是该功能指针,那么您就搞砸了。
成员函数需要一个this
指针才能被调用,如果你无法通过它,那你就不走运了(我想std::vector<std::string>* args
指针就是你传递的指针图书馆)。
换句话说,即使该库使用C ++容器,它也不是一个好的C ++库,因为它依赖于免费函数来进行回调。一个好的C ++库会使用boost::function
或类似的东西,或者至少让你传递一个void* user_data
指针,它会被传递给你的回调。如果你有这个,你可以传递你的类的this
指针,将它转回回调内部,并调用相应的成员函数。