У меня действительно странная проблема в 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);
ценность моего имущества теряется.Я понятия не имею, что может быть причиной этого.Кто-нибудь сталкивался с чем-то подобным раньше?Я думаю, что это может быть скопировано ...