C++ 将引用从Python传递到c++;返回值用swig包装的函数

C++ 将引用从Python传递到c++;返回值用swig包装的函数,c++,python-3.x,pass-by-reference,swig,C++,Python 3.x,Pass By Reference,Swig,免责声明,我是一个恶棍和恶棍 我有自己的C++库,我用python把它包起来,用SWIG。< /P> 我的C++类是这样的: public MyCppClass() { public: void MyFunction(char* outCharPtr, string& outStr, int& outInt, long& outLong) { outCharPtr = new char[2]; outCharPtr[0] =

免责声明,我是一个恶棍和恶棍

我有自己的C++库,我用python把它包起来,用SWIG。< /P> <>我的C++类是这样的:

public MyCppClass()
{
public:
   void MyFunction(char* outCharPtr, string& outStr, int& outInt, long& outLong)
   {
         outCharPtr = new char[2];
         outCharPtr[0] = "o";
         outCharPtr[1] = "k";

         outStr = "This is a result";

         outInt = 1;

         outLong = (long)12345;
    }

}
现在我用swig包装这个类,并说这个模块叫做MyClass

我想在python中实现的是以下代码(或者说伪代码,因为如果它是可以工作的代码)和输出:

import module MyClass
from MyClass import MyCppClass

obj = MyCppClass();

outCharPtr = "";
outStr = "";
outInt = 0;
outLong = 0;

obj.MyFunction(outCharPtr, outStr, outInt, outLong);

print(outCharPtr);
print(outStr);
print(outInt);
print(outLong);
我想要的输出是:

>>>Ok
>>>This is a result
>>>1
>>>12345
我正在使用python 3.4

我真的很抱歉,如果这是一些基本的,但我已经花了大约8个小时的决议,不能想出任何东西

任何帮助都将不胜感激


谢谢。

这里有一种方法。我对您的非工作示例进行了一些修改:

例如,我
一个问题是Python没有out参数。您已经创建了不可变的
str
int
Python对象,因此所需的语法无法工作。对象无法更改。SWIG可以为您做的是将C/C++输出参数转换为返回值的元组。例如,
outCharPtr,outsr,outInt,outLong=obj.MyFunction()
。非常感谢您的澄清!非常感谢你的回答,实际上我是这样工作的。但是还有其他的方法吗?虽然它的工作百分之百正确,但它看起来有点难看。这是简单的方法。它利用预构建的助手来配置输出参数。这些将应用于以相同方式命名参数的任何函数,或者您可以更一般地说
%apply long&OUTPUT{long&}
使所有
参数变长&
输出参数。
%module example

%include <std_string.i>
%include <cstring.i>

%cstring_bounded_output(char* outCharPtr, 256)
%apply std::string& OUTPUT {std::string& outStr};
%apply int& OUTPUT {int& outInt};
%apply long& OUTPUT {long& outLong};

%inline %{

class MyCppClass
{
public:
   void MyFunction(char* outCharPtr, std::string& outStr, int& outInt, long& outLong)
   {
         outCharPtr[0] = 'o';
         outCharPtr[1] = 'k';
         outCharPtr[2] = '\0';

         outStr = "This is a result";

         outInt = 1;

         outLong = (long)12345;
    }

};

%}
>>> import example
>>> c=example.MyCppClass()
>>> c.MyFunction()
['ok', 'This is a result', 1, 12345]