SWIG指针问题

SWIG issue with pointers

本文关键字:问题 指针 SWIG      更新时间:2023-10-16

我在用SWIG包装C++类的成员时遇到问题。

我有一个类,它有一个返回map<int, postLib::nastran::element>的方法。

接口文件中的类postLib::nastran::element为:

class element {
public:
    element(void) ;
    element( const element &in) ;
    ~element(void) ;
    // data manipulation
    %feature("docstring", "getType()->intntReturns an id corresponding to the TYPE of FE element") getType;
    int getType(void) const ;
    std::string  getTypeName(void) const ;
    int getNbrNodes(void) const ;
    int getNode(int index) const ;
    /*
    %extend {
            std::set<int>  getNodes(void) {
            const std::set<int> *siList;
            siList = &$self->getNodes();
            return *siList;
            }
    }*/
} ; //class element

我的方法是这样的:

PyObject * getEls(void) {
    std::map<int, postLib::nastran::element> els = $self->getElements();
    std::map<int, postLib::nastran::element>::iterator it;
    //PyObject * result = PyDict_New();
    PyObject * result = PyList_New(els.size());
    for (std::map<int, postLib::nastran::element>::iterator it=els.begin(); it!=els.end(); ++it) {
        PyObject * k = Py_BuildValue("i", (it->first)-1);
        postLib::nastran::element * e = &(it->second);
        //PyObject * v = Py_BuildValue("i", &(it->second));
        PyObject *v = SWIG_NewPointerObj((void *)e, SWIGTYPE_p_postLib__nastran__element, SWIG_POINTER_OWN);
        //PyDict_SetItem(result, k, v);
        PyList_SetItem(result, (it->first)-1, v );
        std::cout << typeid(&it->second).name()  << std::endl;
    }
    return result;
}

当我在Python的元素实例上调用方法getType()时,我得到以下错误消息:

pure virtual method called

元素类继承自另一个更通用的元素类,该类将getType定义为virtual。

有什么想法吗?

提前谢谢。

我从未在Python语言中使用过swig,但我在制作Java包装器时遇到过这个错误,希望它也是一样。

当您从Python调用getType成员方法时会出现此错误,因为它是C++纯虚拟方法,这意味着它没有实现,并且打算由子类覆盖/实现。因此,基本上从Python调用的是一个未实现的方法。

postLib::nastran::element是否将该方法声明为虚拟并等于0,类似于:

virtual int getType(void) const = 0;

如果是,那么它是纯虚拟的,并且在你的.i文件中没有这样声明它。当SWIG遇到一个具有纯虚拟方法的类时,它不会为该类型生成构造函数(因为您无法实例化缺少实现的东西)。

如果该方法是纯虚拟的,那么该类将被子类化。Swig可以使用directors功能来实现这一点,因此您可以从Python扩展C++类并使用它。