2013-07-17 3 views
0

У меня возникла проблема с переносом члена класса C++ с помощью SWIG.Проблема с SWIG с указателями

У меня есть класс, который имеет метод, который возвращает 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; 
} 

Когда я вызываю метод GetType() в случаях элемент из Python Я получаю следующее сообщение об ошибке сообщение:

pure virtual method called 

Класс элемента наследуется от другого mo re generic element, который определяет getType как виртуальный.

Любые идеи?

Заранее спасибо.

ответ

0

Я никогда не использовал swig с языком Python, но я столкнулся с этой ошибкой при создании оболочки Java, надеюсь, что это то же самое.

Эта ошибка возникает из-за того, что из Python вы вызываете метод члена getType, потому что это чистый виртуальный метод C++, это означает, что он не имеет реализации и предназначен для перезаписывания/реализации подклассами. Поэтому в основном из Python вы вызываете не реализованный метод.

ли postLib::nastran::element объявить метод как виртуальный и равно 0, что-то вроде:

virtual int getType(void) const = 0; 

Если это то чисто виртуальный и в вашем .i файл не объявить его таким образом. Когда SWIG встречает класс с чистыми виртуальными методами, он не генерирует конструкторы для этого типа (потому что вы не можете создать экземпляр чего-то, у которого отсутствует реализация).

Если метод является чисто виртуальным, то этот класс предназначен для подкласса. Swig может сделать это, используя функцию directors, поэтому вы можете расширить этот класс C++ с Python и использовать его.

Смежные вопросы