Boost Python - потеря данных при вызове функции - PullRequest
1 голос
/ 25 августа 2011

У меня действительно странная проблема в Boost Python.Я сосредоточился на конкретном свойстве / методе, чтобы упростить пример.Вот ситуация:

В моей программе есть класс Attack.Со следующей компоновкой (упрощенно, например)

class Attack : public Action
{
public:
    virtual int CalculateDamage(const std::vector<BattleCharacter*>& users, BattleCharacter* target, const std::vector<Actions::ActionTarget>& targets, BattleField *field);
protected:
    bool Hit;
}

я выставил Attack to python, сделав его перезаписываемым, следующим образом:

struct AttackWrapper : Game::Battles::Actions::Attack
{
    int AttackWrapper::CalculateDamage(const std::vector<Game::Battles::BattleCharacter*>& users, Game::Battles::BattleCharacter* target, const std::vector<Actions::ActionTarget>& targets, Game::Battles::BattleField *field)
    {
        return call_method<int>(self, "CalculateDamage", users, ptr(target), targets, ptr(field));
    }
    int AttackWrapper::CalculateDamageDefault(const std::vector<Game::Battles::BattleCharacter*>& users, Game::Battles::BattleCharacter* target, const std::vector<Actions::ActionTarget>& targets, Game::Battles::BattleField *field)
    {
        return this->Attack::CalculateDamage(users, target, Targets, field);
    }
}

И выставление python выполняется следующим образом:

class_<Attack, AttackWrapper, boost::shared_ptr<Attack>, bases<Action> >("Attack")
    .def("CalculateDamage", &AttackWrapper::CalculateDamageDefault);

Сначала я думал, что все работает нормально, так как я могу переопределить метод CalculateDamage в Python и заставить его работать правильно.Однако, когда я хочу использовать обычный Attack->CalculateDamage, происходит следующее:

Я звоню CalculateDamage только тогда, когда Hit - это истина, и я могу подтвердить через точку останова, когда я нажму эту строку, Hit - это истина:

return call_method<int>(self, "CalculateDamage", users, ptr(target), targets, ptr(field));

Теперь, поскольку я не переопределил CalculateDamage в Python для этого экземпляра атаки, он заканчивается разрешением AttackWrapper::CalculateDamageDefault.Но к тому времени, когда я вхожу в AttackWrapper :: CalculateDamageDefault, Hit больше не соответствует действительности.То есть, когда я ломаю эту строку:

return this->Attack::CalculateDamage(users, target, Targets, field);

Хит ложен.Так что где-то между

return call_method<int>(self, "CalculateDamage", users, ptr(target), targets, ptr(field));

и разрешением до

return this->Attack::CalculateDamage(users, target, Targets, field);

ценность моего имущества теряется.Я понятия не имею, что может быть причиной этого.Кто-нибудь сталкивался с чем-то подобным раньше?Я думаю, что это может быть скопировано ...

...