所以情况就是这样:我正在使用C++,SDL和GLConsole.我有一个类SDLGame,它有Init(),Loop(),Render()等-实际上,它适用于我的比赛类的逻辑.
到目前为止,GLConsole是一个不错的库 - 它允许我定义CVars等,甚至在我的SDL类中.但是,在定义命令时,我必须指定一个ConsoleFunctypedef为的命令
typedef bool (*ConsoleFunc)( std::vector<std::string> *args);
Run Code Online (Sandbox Code Playgroud)
很简单.但是,就像我说的,我的函数都在我的类中,我知道我不能将指向类的函数作为指针到函数的参数传递.我不能定义静态函数或在我的类之外创建函数,因为其中一些ConsoleFunc必须访问类数据成员才有用.我想保留OOP,因为 - 好吧,OOP很好.
好吧,我实际上已经解决了这个问题 - 但它非常难看.我只有一个SDLGame声明为extern变量的实例,并在我的ConsoleFuncs/main类中使用它.
所以,问题是:有没有办法做到这一点,就像我这样做一样不愚蠢和愚蠢?(或者:是否有像GLConsole这样支持SDL的控制台库,可以做我正在描述的内容?)
如果您拥有的唯一接口是该功能指针,那么您就搞砸了.
一个成员函数需要一个this被调用的指针,如果你无法通过它,那你就不走运了(我猜这个std::vector<std::string>* args指针就是你从库中传递的指针).
换句话说,即使该库使用C++容器,它也不是一个好的C++库,因为它依赖于免费函数来进行回调.一个好的C++库会使用boost::function或者类似的东西,或者至少让你传递一个void* user_data指针,它会被传递给你的回调.如果你有这个,你可以传递this你的类的指针,将它转回回调内部,并调用适当的成员函数.