Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将python对象传递给需要指针类型的函数 我使用SWIG将一些C++ API包到Python。_Python_C++_Swig - Fatal编程技术网

如何将python对象传递给需要指针类型的函数 我使用SWIG将一些C++ API包到Python。

如何将python对象传递给需要指针类型的函数 我使用SWIG将一些C++ API包到Python。,python,c++,swig,Python,C++,Swig,C++ API看起来像这样。 class CThostFtdcMdSpi { public: virtual void OnFrontConnected(){}; virtual void OnFrontDisconnected(int nReason){}; virtual void OnHeartBeatWarning(int nTimeLapse){}; ... }; class MD_API_EXPORT CThostFtdcMdApi { public: static CThostF

C++ API看起来像这样。

class CThostFtdcMdSpi
{
public:
virtual void OnFrontConnected(){};
virtual void OnFrontDisconnected(int nReason){};
virtual void OnHeartBeatWarning(int nTimeLapse){};
...
};

class MD_API_EXPORT CThostFtdcMdApi
{
public:
static CThostFtdcMdApi *CreateFtdcMdApi();
virtual void RegisterSpi(CThostFtdcMdSpi *pSpi) = 0;
...
}
MdSpi定义了一些回调函数行为。 MdApi需要调用RegisterSpi(CThostFtdcMdSpi*pSpi)来注册这些回调函数 这就是我想在python中使用它的方式

class Quote(CThostFtdcMdSpi):
def OnFrontConnected(self):
    pass

def OnFrontDisconnected(self, *args):
    pass

md = CThostFtdcMdApi_CreateFtdcMdApi()
q = Quote()
md.RegisterSpi(q)
Python给出了以下错误消息:

def RegisterSpi(self, *args): return _MdApi.CThostFtdcMdApi_RegisterSpi(self, *args)
TypeError: in method 'CThostFtdcMdApi_RegisterSpi', argument 2 of type 'CThostFtdcMdSpi *'
这是我的MdApi.i。MdApi和MdSpi都是在ThostFtdcMdApi.h中定义的

%module MdApi
%{
#include "ThostFtdcMdApi.h"
%}

%feature("director") CThostFtdcMdSpi;
%feature("director") CThostFtdcMdApi;

%include "ThostFtdcMdApi.h"

看起来您缺少在模块级别启用控制器。.i文件的第一行必须是:

%module(directors="1") MdApi
从:

默认情况下,控制器功能被禁用。要使用控制器,必须对接口文件进行两次更改。首先,将“directors”选项添加到%module指令中,如下所示:

%module(directors="1") modulename
如果没有此选项,将不会生成控制器代码。其次,您必须使用
%功能(“director”)
指令告诉SWIG哪些类和方法应该获得director


没有更多的代码很难判断,但这看起来可能与。。。如果是这样,请尝试定义
\uuuu init\uuuu
,并调用您的超级构造函数。我回答的第一部分:应该是一个完整的例子。您是否尝试过使用SWIG文档中描述的以及发行版附带的SWIG示例中所示的
%功能(“director”)
?请显示您使用的.i文件。@Flexo我使用%feature(“director”),但错误仍然存在。@scholli我也上传了我的.i文件。我用错了吗?哦,你是对的。那是个愚蠢的错误!谢谢,它解决了我的问题!