Okay I think something else is majorly wrong; my component objects are being 
seen at Item onjects. I'll try to keep the code I show to a minimum. 
In my python file, I have the following:
def ItemFactory(ItemNode):    ItemName = ItemNode.attrib["name"]    if (True):  
  #if ItemName == "Elixir":        CurrentItem = Item(ItemName)        print 
ItemName        componentNode = ItemNode.find("Components");        if 
(componentNode != None):            components = componentNode.getchildren()    
        for component in components:                if component.tag == 
"HealingComponent":                    healer = UseComponent("HealUseModule", 
True, True)                    print "Adding Healing Component"                 
   CurrentItem.RegisterComponent("Healing Component", healer)        
ItemModule.ItemLibrary.AddItem(CurrentItem)
ItemNode is just an XML node that I parse for properties. Each Item node gets 
sent to this function. As per Jim's advice, RegisterComponent looks as follows:
void RegisterComp(Items::Item& item, const std::string& compName, 
std::auto_ptr<UseComponentWrap> comp)//, void* comp){ 
item.RegisterComponent(compName, comp.get());   comp.release();}
Now, the components are registering. The problem is, when I try do the 
following:
try     {               boost::shared_ptr<Items::Item> item = 
Game.GetItemLibrary().GetItem("Elixir");          Components::Component* heal = 
item->GetComponent("Healing Component");                          
Components::UseComponent* healertrue = 
dynamic_cast<Components::UseComponent*>(heal);           if (healertrue != 
nullptr)                      
healertrue->Use(std::vector<Character::BaseCharacter*>(), 
std::vector<Character::BaseCharacter*>());    }       catch 
(boost::python::error_already_set)        {               PyErr_Print();  }
it prints out this error:
AttributeError: 'Item' object has no attribute 'Use'
this is really confusing. How could my UseComponent have become an Item?
I was testing it, and set the AddItem function as:
static std::vector<Components::Component*> test;void 
ItemDatabase::AddItem(boost::shared_ptr<Item> item)        {               if 
(item.get() != nullptr)              {                       
IDToItemMap[item->GetID()] = item;                      
NameToItemMap[item->GetName()] = item;                  auto healComp = 
item->GetComponent("Healing Component");                        if (healComp != 
nullptr)                        {                               
test.push_back(healComp);                               int x = 10;             
        }               }       }
Here's the weird thing. While I'm adding items, I used x = 10 as a breakpoint 
to watch healComp's be added to test. The first healComp get's inserted 
correctly, and the PyObject's tp_name says UseComponent. When the second item 
with a healComp is being added, I used the vector to check the first healComp 
inserted and it somehow became an item (tp_name says Item). This is really 
weird. I thought it might be a scoping problem in my python code, but I can't 
see anything wrong with it. I'm not sure if it's relevant, but I'm including my 
UseComponent wrapping
//Class definitionclass UseComponentWrap : public Components::UseComponent      
        {               public:                 UseComponentWrap(PyObject* 
self_);                      UseComponentWrap(PyObject* self_, const 
std::string& name, bool hasUse, bool hasBattleUse);                     
UseComponentWrap(PyObject* self_, const Components::UseComponent& cmp);         
        bool Use(std::vector<Character::BaseCharacter*>& Users, 
std::vector<Character::BaseCharacter*>& Targets) override;                      
bool UseDefault(std::vector<Character::BaseCharacter*>& Users, 
std::vector<Character::BaseCharacter*>& Targets);                        bool 
BattleUse(std::vector<Battle::BattleCharacter*>& Users, 
std::vector<Battle::BattleCharacter*>& Targets, Battle::BattleField* field) 
override;                      bool 
BattleUseDefault(std::vector<Battle::BattleCharacter*>& Users, 
std::vector<Battle::BattleCharacter*>& Targets, Battle::BattleField* field);    
                    Components::UseComponent::ClonePtr Clone() const override;  
                    Components::UseComponent::ClonePtr CloneDefault() const;    
                    PyObject* self;

                private:
                };
//Python Wrapping
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&>())                           .def("BattleUse", 
&Components::UseComponent::BattleUse, &UseComponentWrap::BattleUseDefault)      
                      .def("Use", &Components::UseComponent::Use, 
&UseComponentWrap::UseDefault)                              .def("HasUse", 
&Components::UseComponent::HasUse)                               
.def("HasBattleUse", &Components::UseComponent::HasBattleUse)                   
        .def("Clone", &Components::UseComponent::Clone, 
&UseComponentWrap::CloneDefault, 
return_value_policy<reference_existing_object>())                              
.def("__copy__", &generic__copy__<Components::UseComponent>)                    
        .def("__deepcopy__", &generic__deepcopy__<Components::UseComponent>)    
                        ;
I really don't see how this can get turned into an Item, Any ideas?
Thanks for the help so far
> Date: Tue, 8 Nov 2011 11:02:23 -0500
> From: tallji...@gmail.com
> To: cplusplus-sig@python.org
> Subject: Re: [C++-sig] Passing ownership to C++ through pointer
> 
> On 11/08/2011 01:12 AM, Jay Riley wrote:
> > I'm trying to pass an object from python to C++. I want C++ to take
> > control of the object.
> 
> <snip>
> 
> > 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.
> >
> 
> I suspect the inheritance is getting in the way, and Boost.Python isn't 
> being as smart as it could be about converting auto_ptr<T> to 
> auto_ptr<U> when T* is convertible to U*.
> 
> You might want to try having your register function wrapper accept 
> auto_ptr<UseComponentWrap> (and if necessary, providing an overload that 
> takes auto_ptr<UseComponent>).
> 
> Before that, however, you might want to just try using "auto_ptr &" 
> rather than simple "auto_ptr".  It'd be unfortunate if that was 
> necessary, but it's a possibility.
> 
> Good luck!
> 
> Jim
> _______________________________________________
> 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