0
std::vector<Spell*> playerSpells{ new Jump(1), new Arrow() };
for (int i = 0; i < playerSpells.size(); i++)
{
player->addSpell(playerSpells[i]);
}
for (int i = 0; i < player->getSpells().size(); i++)
{
auto spell = player->getSpells()[i];
player->getSpells()[i]->icon->onClickEndEH.add([=]() {
auto a = player->getSpells()[i];
auto b = player->getSpells()[i]->sprite;
});
}
まず、spell
変数をチェックし、そのフィールドが正しく初期化されています。ラムダ関数が呼び出されると、変数bが破損します。十分でない場合は、コードの他の部分を提供することができます。コピーによるラムダ関数のキャプチャ結果が破損したデータになる
できるだけ簡略化しました。
//GAMEOBJECT.H
class GameObject
{
public:
cocos2d::Sprite* sprite = nullptr;
GameObject(const std::string fileName = "", bool clickable = false);
~GameObject();
};
//GAMEOBJECT.CPP
GameObject::GameObject(const std::string fileName, bool addClickEvent)
{
if (fileName != "")
{
this->sprite = Sprite::create(fileName);
}
else
{
this->sprite = Sprite::create();
}
if (addClickEvent)
{
this->addTouchListener();
this->clickable = true;
}
}
GameObject::~GameObject()
{
Director::getInstance()->getEventDispatcher()->removeEventListener(this->listener);
}
//SPELL.H
class Spell : public GameObject
{
public:
GameObject* icon = nullptr;
Spell(const std::string fileName = "", bool clickable = false);
~Spell();
}
//SPELL.CPP
Spell::Spell(const std::string fileName, bool clickable) : GameObject(fileName, clickable)
{
}
Spell::~Spell()
{
delete icon;
}
//ARROW.H
class Arrow : public Spell
{
public:
Arrow();
~Arrow();
};
//ARROW.CPP
Arrow::Arrow() : Spell("arrow.png")
{
this->icon = new GameObject("arrow.png", true);
}
ラムダが呼び出される前に 'playerSpells'のポインタで参照されていた呪文が破壊された可能性はありますか? – user2079303
ストロークに遭遇したばかりか、これは有効ではないC++です。 "for each"と "player Spellsの自動スペル"は、PythonとC++の変わった奇妙な子孫のように見えます。 –
@SamVarshavchik私はそれがVisual Studioについてだと思います。私はそれを変更するつもりです。しかし、それは働いている。 – Cem