Sorry just as a quick append, UseComponentWrap inherits from UseComponent to 
allow overriding of a few virtual methods

On 2011-11-08, at 1:13 AM, "Jay Riley" <super24bitso...@hotmail.com> wrote:

> I'm trying to pass an object from python to C++. I want C++ to take control 
> of the object.
> 
> The object I'm trying to change ownership on is defined in it's module as 
> follows (superfluous code removed):
> 
> 
> BOOST_PYTHON_MODULE(ComponentModule)
>               {
> 
>                       class_<Components::Component, 
> std::auto_ptr<Components::Component> >("Component")
>                               .def(init<>())
>                               .def(init<bool, boost::python::optional<const 
> int> >())
>                               .def(init<const std::string&, int, 
> boost::python::optional<bool, const int>  >())
>                               .def(init<const std::string&, const 
> std::string&, boost::python::optional<bool, const int>  >())
>                               ;
> 
>                       class_<Components::UseComponent, 
> std::auto_ptr<UseComponentWrap>, bases<Components::Component> 
> >("UseComponent")
>                               .def(init<>())
>                               .def(init<const std::string&,bool, bool>())
>                               .def(init<const Components::UseComponent&>())
>                               ;
>               }
>       }
> 
> And The object I want to take control is:
> 
> BOOST_PYTHON_MODULE(ItemModule)
>               {
>                       
>                       class_<Items::Item, bases<Entity> >("Item")
>                               .def(init<Items::Item&>())
>                               .def(init<const std::string&>())
>                               
> .def("RegisterComponent",&Items::Item::RegisterComponent )
>                               ;
>               }
> 
> Register Component is the function that takes control of the component. It's 
> full definition is:
> 
> void Item::RegisterComponent(const std::string& indexName, 
> Components::Component* component)
>               {
>                       auto it = ComponentCollection.find(indexName);
>                       if (it != ComponentCollection.end())
>                         {
>                               delete it->second;
>                                 ComponentCollection.erase(it);
>                       ComponentCollection[indexName] = component;
>               }
> 
> The item posses the component until destroyed/overwritten.
> 
> A sample piece of python code would be:
> 
> healer = UseComponent("HealUseModule", True, True)
> print "Adding Healing Component"
> CurrentItem.RegisterComponent("Healing Component", healer)
> 
> where CurrentItem is an item. The problem here is that when the component 
> goes out of scope in the python file, it get's deleted adn invalidated since 
> C++ hasn't taken ownership of it. I tried following the advice here
> 
> http://www.boost.org/doc/libs/1_36_0/libs/python/doc/v2/faq.html#ownership
> 
> which is why I wrapped Component/UseComponent in an auto_ptr. Additionally 
> fro, this advice, I changed to RegisterComponent wrap to
> 
> .def("RegisterComponent", &RegisterComp)
> 
> where RegisterComp is 
> 
> void RegisterComp(Items::Item& item, const std::string& compName, 
> std::auto_ptr<Components::UseComponent> comp)//, void* comp)
>               {
>                       item.RegisterComponent(compName, comp.get());
>                       comp.release();
>               }
> 
> this fails, saying the Python argument types did not match the C++ signature. 
> I'm certain it's the std::auto_ptr<Components::UseComponent> comp argument 
> that is invalid because the call succeeds when that argument is removed but 
> item and name are left.
> 
> Am I doing something wrong? base on that snippet it should work. Is there 
> another way to do this? I know I should probably switch to smart_ptrs and I'm 
> considering it, but Id like to be able to know how to do this, even if its 
> just for future reference. Any help would be appreciated.
> 
> Thanks
> _______________________________________________
> Cplusplus-sig mailing list
> Cplusplus-sig@python.org
> http://mail.python.org/mailman/listinfo/cplusplus-sig
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

Reply via email to