2012-05-10 3 views
1

나는 파이썬을 C++ 애플리케이션에 임베드했다. C++은 파이썬을 호출하고 그것을 인수로 C++ 객체로 전달합니다. 그 객체는 몇 가지 가상 함수를 가지고 있으며 파생 된 클래스의 기본 클래스가 될 수 있습니다. boost :: python을 가상 함수라고 이해하는 방법은 무엇입니까? 파이썬에서부스트 파이썬 : C++ 가상 함수를 호출하는 방법

class Base { 
public: 
    virtual void func(); 
} 

class Derived { 
public: 
    virtual void func(); 
} 

BOOST_PYTHON_MODULE(module_api) { 
    class_<Base>("Base") 
    .def("func", &Base::func); // ?? what should I put here? 
} 

int main() { 
    //... initialization 
    Derived derived; 
    main_namespace["pyentry"](&derived); 
} 

:
C++로 :

는 다음을 고려

def pyentry(baseref): 
    baseref.func() # here I want Derived::func() to be called 

은 내가 잘못 여기서 뭐하는 거지?

+3

언제나 비 가상 포워딩 기능을 넣을 수 있습니다 :'void Base :: doFunc() {this-> func(); }','.def ("func", & Base :: doFunc);' –

+0

나는이 오버 헤드를 피하기를 바랐다 ... 그게 boost :: python이 전부라고 생각하지 않습니까? 오버 헤드를 피하는 ...? – shoosh

+0

기본을 마무리해야합니다. - http://www.boost.org/doc/libs/1_49_0/libs/python/doc/v2/wrapper.html – babak

답변

2

Boost.Python은 파생 클래스 객체를 딥 복사하여 기본 객체로 분할하여 파이썬으로 변환합니다. Boost.Python에 Python에서 재정의해야 할 필요가 없다면 함수가 가상 적이라는 사실을 말할 필요가 없다.

안전을 위해 그 복사 작업을하고 있습니다 : Python 개체가 C++에서 삭제되지 않도록 확실히하고 있지만 Python에는 여전히 참조가 있습니다. 그리고 그것은 Base에 그것을 얇게 자르고 있습니다 - 왜냐하면 그것은 Derived에 대해 아무 것도 모르기 때문입니다.

나는이 문제를 해결하는 두 가지 방법을 생각할 수 있습니다

  • Derived에 대한 사소한 래퍼를 제공합니다. Boost.Python은 파이썬으로 변환 할 때 여전히 그것을 복사하지만, 그렇게하면 더 이상 Base으로 슬라이스하지 않습니다.

  • shared_ptrDerived 인스턴스를 생성, (register_ptr_to_python< boost::shared_ptr<Base> >()를 통해) Base에 대한 shared_ptr 변환을 등록하고 파이썬 함수에 인수로 그를 전달합니다. 이제 Boost.Python은 Python 래퍼에 shared_ptr 참조가 있기 때문에 Python 객체가있는 동안 C++ 객체를 삭제할 수 없다는 것을 알고 있습니다.

+0

고마워요! 그 :) – shoosh

관련 문제