使用SWIG化的Python从C++基类派生

2024-09-28 22:24:46 发布

您现在位置:Python中文网/ 问答频道 /正文

注:对应的主旨是here。在


我有一个抽象基类和一个接受指向基类的指针的方法,例如

#ifndef MYTEST_HPP
#define MYTEST_HPP

#include <iostream>
#include <memory>

class MyBaseClass {
  public:
    virtual
    double
    eval(const double x) const = 0;
};

class Square: public MyBaseClass {
  public:
    virtual
    double
    eval(const double x) const
    {
      return x*x;
    }
};


void
mytest(const std::shared_ptr<MyBaseClass> & a) {
  std::cout << a->eval(1.0) << std::endl;
  std::cout << a->eval(2.0) << std::endl;
  std::cout << a->eval(3.0) << std::endl;
}

#endif // MYTEST_HPP

喝了这个之后

^{pr2}$

我可以在Python中创建Square实例并将它们馈送到mytest中,例如

import mytest
a = mytest.Square()
mytest.mytest(a)

正如预期的那样,这将打印出来

1.0
4.0
9.0

我现在想从MyBaseClass派生更多的类,但是要从Python派生。不幸的是

class Cube(mytest.MyBaseClass):
    def __init__(self):
        return

    def eval(self, x):
        return x*x*x

c = Cube()
mytest.mytest(c)

导致错误

Traceback (most recent call last):
  File "../source/test.py", line 14, in <module>
    mytest.mytest(c)
TypeError: in method 'mytest', argument 1 of type 'std::shared_ptr< MyBaseClass > const &'

有什么提示吗?在


Tags: returnevalpublic基类classstddoublehpp
1条回答
网友
1楼 · 发布于 2024-09-28 22:24:46

收到了(通过https://stackoverflow.com/a/9042139/353337):

将控制器功能添加到MyBaseClass

%module(directors="1") mytest

%{
#define SWIG_FILE_WITH_INIT
#include "mytest.hpp"
%}

%include <std_shared_ptr.i>
%shared_ptr(MyBaseClass);
%shared_ptr(Square);

%feature("director") MyBaseClass;

%include "mytest.hpp"

并在Python中正确初始化类

^{pr2}$

相关问题 更多 >