1962
Comment:
|
1866
the c++ code did not compile at all the way it was presented
|
Deletions are marked like this. | Additions are marked like this. |
Line 7: | Line 7: |
The life time of C++ objects created by "new A" kan be handled by Pythons garbage collection by using the {{{manage_new_object}}} storage policy: | The life time of C++ objects created by "new A" can be handled by Python's garbage collection by using the {{{manage_new_object}}} storage policy: |
Line 9: | Line 9: |
{{{struct A { | {{{ struct A { |
Line 28: | Line 29: |
print A.hello() | print an_A.hello() |
Line 34: | Line 35: |
give away ownership of objects in C++. The following suggests a way to handle shared_ptr objects in Python, introducing the notation {{{(+ptr).foo()}}} in python to immitate C++'s {{{(*ptr).foo()}}}: |
give away ownership of objects in C++. Theese kind of smart pointer are automatically handled, if you declare their existence, when declaring the class to boost.python. |
Line 38: | Line 38: |
{{{#include <boost/shared_ptr.h> | E.g. {{{ #include <string> #include <boost/shared_ptr.hpp> #include <boost/python.hpp> |
Line 40: | Line 46: |
using namespace std; using namespace boost::python; |
|
Line 42: | Line 50: |
shared_ptr<A> create () { return shared_ptr<A>(new A); } std::string hello () { return "Just nod if you can hear me!"; } |
static shared_ptr<A> create () { return shared_ptr<A>(new A); } std::string hello () { return "Just nod if you can hear me!"; } |
Line 48: | Line 56: |
class_<A>("A",init<>()) .def("create",&A::create,return_value_policy<return_by_value>()) |
class_<A, shared_ptr<A> >("A",init<>()) .def("create",&A::create ) |
Line 52: | Line 60: |
; class_< shared_ptr<A> >("A_ptr", init<const shared_ptr<A>& >()) .def("__pos__",&boost::shared_ptr<A>::get,return_internal_reference<>()) ; |
; |
Line 63: | Line 67: |
an_A = A_ptr.create() print (+an_A).hello() |
an_A = A.create() print an_A.hello() |
Pointers and smart pointers
Since Python handles memory allocation and garbage collection automatically, the concept "pointer" is not meaningful within Python. However, many C++ API exposes either raw pointers or shared pointers, and to wrap such APIs one would need to deal with pointers.
Pointers (raw C++ pointers)
The life time of C++ objects created by "new A" can be handled by Python's garbage collection by using the manage_new_object storage policy:
struct A { static A* create () { return new A; } std::string hello () { return "Hello, is there anybody in there?"; } }; BOOST_PYTHON_MODULE(shared_ptr) { class_<A>("A",no_init) .def("create",&A::create,return_value_policy<manage_new_object>()) .staticmethod("create") .def("hello",&A::hello) ; }
A sample python program:
from pointer import * an_A = A.create() print an_A.hello()
Smart pointers
Smart pointers, e.g. boost::shared_ptr<T>, is another common way to give away ownership of objects in C++. Theese kind of smart pointer are automatically handled, if you declare their existence, when declaring the class to boost.python.
E.g.
#include <string> #include <boost/shared_ptr.hpp> #include <boost/python.hpp> using namespace boost; using namespace std; using namespace boost::python; struct A { static shared_ptr<A> create () { return shared_ptr<A>(new A); } std::string hello () { return "Just nod if you can hear me!"; } }; BOOST_PYTHON_MODULE(shared_ptr) { class_<A, shared_ptr<A> >("A",init<>()) .def("create",&A::create ) .staticmethod("create") .def("hello",&A::hello) ; }
A sample python program:
from shared_ptr import * an_A = A.create() print an_A.hello()