[C++-sig] Subclassing C++ classes in Python

Ernie Lee tr.ernie.l at gmail.com
Mon Mar 16 19:05:22 CET 2015


Hi Holger,

  Adding checks for override and default implementation fixed the issue. -
Thank you!

  Best,

Ernie.

On Mon, Mar 16, 2015 at 2:04 AM, Holger Joukl <Holger.Joukl at lbbw.de> wrote:

>
> Hi Ernie,
>
> >   When I tries to use class exposed as ’wrapper’ as substitute for C
> > ++ original class i am getting a segfault error (see example below).
> > Is there is something wrong with a way i create a wrapper-class or
> > it is not intended to work as substitute for a base class?
>
> I haven't tried your code sample but you'd normally just expose the
> wrapper class *instead* of the original class, with the name of "A".
>
> Python users don't need to know about the wrapper class intricacies.
>
> If you expose a non-pure-virtual method you should also add the
> default implementation, just as you cited from
>
> http://www.boost.org/doc/libs/1_57_0/libs/python/doc/tutorial/doc/html/python/exposing.html#python.class_virtual_functions
> (necessary to avoid infinite recursion if your Python override
> implementation calls the
> C++ base class method)
>
> I.e. something like (untested! Stick closely to the tutorial if in doubt)
>
> #include <iostream>
> #include <boost/python.hpp>
>
> class A
> {
> public:
>     virtual ~A() { std::cout << "A destructor for object: " << this <<
>                    std::endl; }
>
>     virtual void info() { std::cout << "C++ A info for object" << this
>                                     << std::endl; }
> };
>
>
> struct A_Wrapper : A, boost::python::wrapper<A>
> {
>     void info(
>     {
>         if (override info_override = this->get_override("info")) {
>             return info_override();
>         }
>         return A::info();
>     }
>
>     void default_info() { return this->A::info(); }
> };
>
>
> BOOST_PYTHON_MODULE(subclass)
> {
>     boost::python::class_<A_Wrapper, boost::noncopyable>("A",
>         boost::python::init <>() )
>        .def("info", &A::info, &A_Wrapper::default_info)
>     ;
> }
>
> So the wrapper class provides you with the callback-ability to Python and
> this is the one to expose.
>
> As per the segfault you get: I guess that this might stem from your not
> calling the boost::python::wrapper<A> base class constructor in your
> A_Wapper
> constructor (note how I didn't provide a constructor for the wrapper
> class):
>
> A_Wrapper() : A() {} // <-- not calling all base constructors here
>
> Again, haven't actually tried it.
>
> Holger
>
> Landesbank Baden-Wuerttemberg
> Anstalt des oeffentlichen Rechts
> Hauptsitze: Stuttgart, Karlsruhe, Mannheim, Mainz
> HRA 12704
> Amtsgericht Stuttgart
> _______________________________________________
> Cplusplus-sig mailing list
> Cplusplus-sig at python.org
> https://mail.python.org/mailman/listinfo/cplusplus-sig
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20150316/559adf58/attachment.html>


More information about the Cplusplus-sig mailing list