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 を virtual として定義する別のより一般的な要素クラスから継承します。

何か案は?

前もって感謝します。

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機能を使用してこれを実行できるため、その C++ クラスを Python から拡張して使用できます。

于 2013-07-20T11:24:37.903 に答える