首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针的SWIG问题

指针的SWIG问题
EN

Stack Overflow用户
提问于 2013-07-18 02:45:15
回答 1查看 238关注 0票数 0

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

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

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

代码语言:javascript
复制
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

我的方法看起来像这样:

代码语言:javascript
复制
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中调用element实例上的方法getType()时,我得到了以下错误消息:

代码语言:javascript
复制
pure virtual method called

element类继承自另一个更通用的element类,该类将getType定义为虚拟的。

有什么想法吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-07-20 19:24:38

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

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

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

代码语言:javascript
复制
virtual int getType(void) const = 0;

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17707779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档