2011-12-21 174 views
5

因此,情况如下:我正在使用C++,SDL和GLConsole。我有一个课程,SDLGame,其中有Init(),Loop(),Render()等 - 本质上,它拥有我的游戏类的逻辑。
到目前为止,GLConsole是一个不错的库 - 它允许我定义CVars等,甚至在我的SDL类中。然而,定义命令的时候,我必须指定一个ConsoleFunc,这是typedef为将指针指向成员函数作为函数指针

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

够简单。但是,正如我所说的,我的函数都在我的类中,我知道我不能将指针类函数作为指针函数参数传递。我无法定义静态函数或在我的类之外创建函数,因为其中一些ConsoleFunc必须访问类数据成员才能使用。我想保持OOP,因为 - 哦,OOP很好。

那么,我确实有这个问题“解决” - 但它是非常丑陋的。我只是将一个SDLGame的实例声明为extern变量,并在我的ConsoleFuncs/main类中使用它。

所以,问题是:有没有办法做到这一点,不像我这样做的愚蠢愚蠢? (或者:是否有像GLConsole这样的支持SDL的控制台库,并且可以执行我所描述的操作?)

回答

7

如果唯一的接口是函数指针,那么就搞砸了。

一个成员函数需要一个this指针被调用,如果你没有办法通过这个,你运气不好(我猜std::vector<std::string>* args指针是你从库中传递的)。

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

+0

井当当。不管怎么说,还是要谢谢你。有任何建议可供其他图书馆使用?我在看OGLConsole,但它有完全相同的问题。 – Chaosed0 2011-12-21 17:32:19

+0

@user:对不起,没有图书馆的建议。 :/ – Xeo 2011-12-21 17:39:24

+0

我强烈建议使用'void *'“用户数据”。当然,它不像现代语言'委托'那么漂亮,但它是一条安全的路径,因为它是您的代码将回调和用户数据作为一对注册。因此,只需将传入的'void *'强制转换为适当的类类型就可以100%安全,因为回调是根据该意图设置的。 – TheBuzzSaw 2011-12-24 07:09:38