我使用SWIG来封装2个C++对象,我将Python解释器嵌入到我的应用程序中(即调用pyRelialZe()等)。在
第一个对象是一些应用程序数据的包装器。 第二个是“助手”对象,也用C++编写,它可以根据它在数据对象中找到的东西执行某些操作。在
python脚本决定何时/如何/是否调用helper对象。在
所以我把一个指针传递给我的C++对象,以便SWIG/Python这样:
swig_type_info *ty = SWIG_MangledTypeQuery("_p_MyDataObject");
if(ty == NULL)
{
Py_Finalize();
return false;
}
PyObject *data_obj = SWIG_NewPointerObj(PointerToMyDataObject, ty, 0);
if(data_obj == NULL)
{
Py_Finalize();
return false;
}
ty = SWIG_MangledTypeQuery("_p_MyHelperObject");
if(ty == NULL)
{
Py_Finalize();
return false;
}
PyObject *helper_obj = SWIG_NewPointerObj(PointerToMyHelperObject, ty, 0);
if(helper_obj == NULL)
{
Py_Finalize();
return false;
}
PyTuple_SetItem(pArgs, 0, data_obj);
PyTuple_SetItem(pArgs, 1, helper_obj);
PyObject *pValue = PyObject_CallObject(pFunc, pArgs);
if(pValue == NULL)
{
Py_Finalize();
return false;
}
在Python中,我们可以看到如下内容:
^{pr2}$现在,除了一件事,这基本上是有效的。在我的C++代码中,当我准备将参数传递给Python脚本时,我观察POTIFOTYDATAObjor的指针值。在
当我在C++实现中设置断点时救命啊,救命啊(),我看到内存地址不同,尽管它似乎是指向MyDataObject的有效实例的指针。在这对我很重要,因为“MyDataObject”实际上是一些可能的派生类的基类。我的helper对象希望对它接收到的指向相应派生类的指针执行适当的(由上下文决定)动态转换。这是失败的,我认为这是显而易见的原因。在
我在SWIG里读过一些关于“影子”物体的东西,这只会增加我的困惑(为我的小脑袋道歉:-p)
那么,SWIG是否出于某种原因复制了我的对象,然后传递了一个指向该副本的指针?如果是这样,那么我就可以理解为什么我关于动态强制转换的假设不会起作用。在
我试图将此添加为注释,但在格式设置上遇到困难,所以。。。。。更多细节如下: 这个问题与参照传递有关。注意,我有两个虚方法helpMe()的实现:
bool MyHelperObject::helpMe(MyDataObject mydata_obj)
{
return common_code(&mydata_obj);
}
bool MyHelperObject::helpMe(MyDataObject *mydata_obj)
{
return common_code(mydata_obj);
}
虽然我为python提供了一个指针,但它调用的是引用传递版本。这解释了为什么我得到不同的指针值。但是我能做些什么来强制调用接受指针参数的版本呢?在
根据您展示的内容,我想您应该确保SWIG只能看到
helpMe
的指针版本。非指针版本将创建一个临时副本,然后将其传递到函数中,这听起来不是您想要的。在SWIG很难选择使用哪个版本,因为它稍微抽象了指针概念,以便更好地匹配Python。在
您可以在声明之前使用
%ignore
或在接口文件中将其显示给SWIG的%import
隐藏SWIG的非指针版本:相关问题 更多 >
编程相关推荐