如何从 class 绑定 C++ 和 Swig 的方法初始化变量

How to initialize a variable from a class method binding C++ with Swig

感谢 swig,我想将一些 C++ 代码绑定到 python。 在我的 C++ 代码中,我通过 class 方法初始化了一些重要的变量。 然而,这种初始化似乎给 swig which returns Error: Syntax error - possibly a missing semicolon.

带来了一些麻烦

下面是从 swig 文档中提取的一个非常简单的例子,我只在方法中添加了这种初始化。 此示例由 3 个文件组成 (my_class.hpp ; my_class.cpp ; py_myclass.i).

my_class.hpp:

#ifndef MYCLASS_H
#define MYCLASS_H

class MyClass {
    public:
    float getSqr();
    float getSqr(float _v);
    
    private:
    float value=2.;
};

float toto=MyClass().getSqr(3.);     // the only line I added !

#endif

my_class.cpp

#include "my_class.hpp"

float MyClass::getSqr() {
    return getSqr(value);
}

float MyClass::getSqr(float value) {
    return value*value;
}

py_myclass.i

%module py_myclass

%{
#include "my_class.hpp"
%}

%include "my_class.hpp"

因此,我根据 swig 文档所做的唯一修改是添加了初始化行 float toto=MyClass().getSqr(3.);。 我试着用它玩了一下,但我总是遇到语法错误。

我从这些文件中执行 swig 来创建包装器。 我用命令行来做:

swig -python -c++ -o py_myclass_wrap.cpp py_myclass.i

这会产生以下错误:

py_myclass.i:13: Error: Syntax error - possibly a missing semicolon.

那么,有没有办法用 swig 完成这种初始化?

我也尝试在文件 py_myclass.i 中的最后一个 %include "my_class.hpp" 之前添加行 %ignore toto;,但似乎忽略本身被忽略了。

SWIG 的 C++ 解析器似乎不支持该初始化语法。

相反,在 header 中使用:

extern float toto;

在 .cpp 文件中对其进行初始化:

float toto=MyClass().getSqr(3.);

然后 SWIG 将只看到外部声明,因为它只解析 .hpp 文件。这是结果的 运行:

>>> import py_myclass
>>> py_myclass.cvar.toto
9.0
>>> c=py_myclass.MyClass()
>>> c.getSqr()
4.0
>>> c.getSqr(9)
81.0