我正在使用boost.python库作为脚本系统在c ++中编写游戏。
我有一个抽象类Object
。现在我创建新类,从Objects
继承它并写入Object *obj = new SomeCoolObject();
我还有一个对象地图:map<string, Object*> objects
。所以在制作完对象之后我做了:objects.insert("name", obj);
。
不要说任何关于释放内存等的内容。我隐藏了那部分以获得更少的代码(我正在使用智能指针)。
所以问题是:
我想要一个包含python-files的文件夹。在每个文件中,我描述了一些Object
派生类,如:
class SomeCoolObject(Object):
...
如何将该类绑定到c ++中?换句话说:如何对c ++程序说有这样的新类。
再一次:colud是一些包含这些类的py文件,我必须导出所有这些文件。
任何想法,伙计们?
答案 0 :(得分:1)
如果您已经加载了模块(例如,使用boost::python::import("module_name")
),您应该能够通过attr()
成员函数引用其中的任何类。通常我会围绕它编写一个包装器函数,因为如果类(或任何其他属性)不存在,它可以引发异常。例如:
boost::python::object getattr(const boost::python::object &obj, const std::string &name)
{
try
{
return obj.attr(boost::python::str::str(name));
}
catch(const boost::python::error_already_set &err)
{
/* we need to fetch the error indicators *before*
* importing anything, as apparently importing
* using boost python clears the error flags.
*/
PyObject *e, *v, *t;
PyErr_Fetch(&e, &v, &t);
boost::python::object AttributeError = boost::python::import("exceptions").attr("AttributeError");
/* Squash the exception only if it's an AttributeError, otherwise
* let the exception propagate.
*/
if (PyErr_GivenExceptionMatches(AttributeError.ptr(), e))
return boost::python::object(); // None
else
throw;
}
}
[... later in the code ...]
using namespace boost::python;
object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
object your_module = import("module_name");
object your_class = getattr(main_namespace, "SomeCoolObject");
// Now we can test if the class existed in the file
if (!your_class.is_none())
{
// it exists! Have fun.
}