使用SWIG通过C++;对象指针指向Python,而不是返回C++;再一次

使用SWIG通过C++;对象指针指向Python,而不是返回C++;再一次,python,c++,pointers,swig,Python,C++,Pointers,Swig,我使用SWIG来封装2个C++对象,我将Python解释器嵌入到我的应用程序中(即调用pyRealAlsie()等)。 第一个对象是一些应用程序数据的包装器。 第二个是“帮助器”对象,也用C++编写,它可以根据数据对象中的发现执行某些操作。 python脚本决定何时/如何/是否调用helper对象 所以我把一个指针传递给我的C++对象,以便SWIG/Python这样: swig_type_info *ty = SWIG_MangledTypeQuery("_p_MyDataObject"); i

我使用SWIG来封装2个C++对象,我将Python解释器嵌入到我的应用程序中(即调用pyRealAlsie()等)。

第一个对象是一些应用程序数据的包装器。 第二个是“帮助器”对象,也用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中,我们看到如下内容:

def go(dataobj, helperobj):
    ## if conditions are right....
    helperobj.helpme(dataobj)
现在,除了一件事,这在很大程度上是有效的。在我的C++代码中,当我准备将参数传递给Python脚本时,我观察POTIOTYYDATAObj.< /P>的指针值。

当我在HelPiBoR.Help()的C++实现中设置断点时,我看到内存地址是不同的,尽管它似乎是指向MyDATAObjor的有效实例的指针。 这对我来说很重要,因为“MyDataObject”实际上是一些可能的派生类的基类。我的helper对象希望对它接收到的指向相应派生类的指针执行适当的(由上下文确定)动态强制转换。这是失败的,我认为这是显而易见的原因

我读过一些关于SWIG中“阴影”物体的东西,这只会让我更加困惑(为我的小脑袋道歉:-p)

那么,SWIG是否出于某种原因复制了我的对象,然后传递了指向该副本的指针?如果是的话,那么我就能理解为什么我关于动态强制转换的假设不起作用

我试图将此添加为注释,但在格式方面遇到了困难,因此。。。。。更多信息如下: 这个问题与参考传递有关。请注意,我有两个虚拟方法helpMe()的实现:


虽然我为python提供了一个指针,但它正在调用引用传递版本。这解释了为什么我会得到不同的指针值。但是我怎样才能强制调用使用指针参数的版本呢?

根据您所展示的内容,我认为您希望确保SWIG只看到
helpMe
的指针版本。非指针版本将创建一个临时副本,然后将其传递到函数中,听起来这不是您想要的

SWIG将很难选择使用哪个版本,因为它稍微抽象了指针概念,以便更好地匹配Python

您可以在声明之前使用
%ignore
,或在界面文件中将非指针版本显示给SWIG的
%import
对SWIG隐藏该版本:

%忽略MyHelperObject::helpMe(MyDataObject mydata_obj)
%导入“some.h”

你能把问题重新集中一点,以更清楚地显示你想要包装的C++接口(具有完整但最小的实现)吗?我脑子里想的是你的想法,但我不想花时间回答,直到我知道我们都在同一页上。
bool MyHelperObject::helpMe(MyDataObject mydata_obj)
{
    return common_code(&mydata_obj);
}
bool MyHelperObject::helpMe(MyDataObject *mydata_obj)
{
    return common_code(mydata_obj);
}