0

我在用 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()->int\n\tReturns 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 定义为虚拟。

有任何想法吗?

提前致谢。

4

1 回答 1

0

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

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

是否postLib::nastran::element将方法声明为虚拟并且等于 0,例如:

virtual int getType(void) const = 0;

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

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

于 2013-07-20T11:24:37.903 回答