Dear List, Can anyone give me a hand in solving this?
Kind regards, Sybren On 23 May 2012 16:21, Sybren A. Stüvel <syb...@stuvel.eu> wrote: > Dear list, > > I'm trying to get my head around shared pointers combined with overloaded > methods. I want to create instances of my class both in Python and C++, but > for some reason I can't get both to work with the same code. I've > constructed a minimal example to show you what I'm trying to do. The full > C++ code with syntax highlighting can be found at > http://pastebin.com/ZqG79QUL > > Sorry for the long mail, but I saw no other way to show my issues in a > clear and unambiguous way. > > -------------------------------------- > class ExampleObject { > public: > std::string name; > > ExampleObject(const std::string & name) : name(name) {} > virtual ~ExampleObject() {} > virtual int some_number() { return 12; } > }; > > typedef boost::shared_ptr<ExampleObject> ExampleObjectPtr; > > ExampleObjectPtr create_example_object(const std::string & name) { > return boost::make_shared<ExampleObject>(name); > } > > void print_name(ExampleObjectPtr object) { > std::cout << "Example object named '" << object->name > << "', nr = " << object->some_number() > << std::endl; > } > -------------------------------------- > > These are the class and functions that I want to wrap. The > ExampleObject::some_number method should be overridable in Python. To this > end, I've created the following wrapper class: > > -------------------------------------- > struct ExampleObject_wrapper : ExampleObject, wrapper<ExampleObject> { > ExampleObject_wrapper(const std::string & name) > : ExampleObject(name), wrapper<ExampleObject>() > {} > > virtual int some_number(void) override { > if( override func_override = this->get_override("some_number")) > return func_override(); > return default_some_number(); > } > > int default_some_number(void) { > return this->ExampleObject::some_number(); > } > }; > > typedef boost::shared_ptr<ExampleObject_wrapper> ExampleObject_wrapper_ptr; > -------------------------------------- > > The Python module is declared as follows: > > -------------------------------------- > BOOST_PYTHON_MODULE(wraptest) { > def("create_example_object", &create_example_object); > def("print_name", &print_name); > > class_<ExampleObject_wrapper, boost::noncopyable, ExampleObjectPtr> > ("ExampleObject", init<const std::string &>()) > .def("some_number", &ExampleObject_wrapper::some_number, > &ExampleObject_wrapper::default_some_number) > ; > } > -------------------------------------- > > This is the Python code that I'm testing with: > > -------------------------------------- > from wraptest import * > > class ExampleSubclass(ExampleObject): > def some_number(self): > return ExampleObject.some_number(self) * 2 > > # Test from Python > from_py_obj = ExampleSubclass('from python') > print_name(from_py_obj) > > # Test from C++ > from_cpp = create_example_object('from C++') > print_name(from_cpp) > -------------------------------------- > > When I compile the module (VS2010, Python 3.2.2, Boost 1.48) and run the > Python script, I would expect the object created in C++ to show the number > 12, and the object created in Python to show the number 24. However, the > output is this: > > Example object named 'from python', nr = 12 > Example object named 'from C++', nr = 12 > > Running a debugger also shows that the ExampleObject_wrapper methods > aren't called at all. When I edit the class_<...> line by replacing > ExampleObjectPtr with ExampleObject_wrapper_ptr, the from-Python object > works just fine, but the from-C++ object gives me an exception: > > Example object named 'from python', nr = 24 > Traceback (most recent call last): > File "C:\workspace\rage\scripts\test_wrapping.py", line 13, in <module> > from_cpp = create_example_object('from C++') > TypeError: No to_python (by-value) converter found for C++ type: class > boost::shared_ptr<class ExampleObject> > > What should I do to be able to instantiate objects in C++ and Python alike? > > Kind regards, > -- > Sybren A. Stüvel > > http://stuvel.eu/ > > > -- Sybren A. Stüvel http://stuvel.eu/
_______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig