Использование указателя void на член функции приводит к нарушению прав доступа, несмотря на наличие экземпляра [закрыто] ⇐ C++
-
Anonymous
Использование указателя void на член функции приводит к нарушению прав доступа, несмотря на наличие экземпляра [закрыто]
Я покажу свои классы, вырежу конструкторы и покажу, где нарушение прав доступа. Пожалуйста, помогите, должно работать.
Spell.cpp
#include "Spell.h" Spell* Spell::CreateSpell(ESpellID Spell_id) { CSpellData Spell_data (spell_id); вернуть новое заклинание (spell_data); } void Spell::InvokeEffect(Character* instigator, Vector Targets, EffectParams& params, int effect_num) { (_spell_manager->*_spell_effects[effect_num])(зачинщик, цели, параметры); } spell.h
#pragma один раз #include #include #include "CSpellData.h" использование пространства имен std; класс PlayerCharacter; класс EnemyCharacter; класс Персонаж; класс SpellManager; класс Заклинание { публика: используя Function = void(SpellManager::*)(Character*, вектор , EffectParams&); Spell(CSpellData& данные); статическое Spell* CreateSpell(ESpellID Spell_id); публика: void InvokeEffect(Character* instigator, цели вектора, EffectParams& params, int effect_num); публика: интервал _level; интервал _опыт; SpellManager* _spell_manager; CSpellData* _c_spell_data; вектор _spell_effects; } SpellManager.cpp (важная часть)
void SpellManager::CreateSpell(Character*spell_owner, ESpellIDspell_id) { Заклинание* заклинание = Spell::CreateSpell(spell_id); заклинание->_spell_manager = это; строка Spell_name = GameplayStatics::GetEnumString(spell_id); mapspell_instance; Spell_instance[spell_name] = заклинание; if (dynamic_cast(spell_owner) != nullptr) { _instanced_spells.push_back(spell_instance); } еще { _instanced_enemy_spells.push_back(spell_instance); } GameplayStatics::AddSpellToCharacter(spell_owner, заклинание); AddSpellEffects (заклинание); } void SpellManager::AddSpellEffects(Spell* заклинание) { заклинание->_spell_effects.push_back(&SpellManager::Fireball_Default); заклинание->_spell_effects.push_back(&SpellManager::Fireball_Level2); заклинание->_spell_effects.push_back(&SpellManager::Fireball_Level3); Данные о персонажах (ECharacterClass::BARBARIAN); PlayerCharacter* player = новый PlayerCharacter(data.GetCharacterData(), data.GetPlayerAttributeData()); ПерсонажДанные врага_данные (ECharacterClass::ENEMY); EnemyCharacter* враг = новый EnemyCharacter(enemy_data.GetCharacterData()); враг->имя = "ущелье"; вектор враги; враги.push_back(враг); Параметры EffectParams; заклинание->InvokeEffect(игрок, враги, параметры, 0); } и заклинания, которые я отталкиваю, имеют одинаковую подпись
void Fireball_Default(Символ* инициатор, векторные цели, EffectParams& параметры);
Здесь я беру указатель SpellManager
spell->_spell_manager = это;
и тут происходит нарушение прав доступа
spell->InvokeEffect(игрок, враги, параметры, 0); void Spell::InvokeEffect(Character* instigator, Vector Targets, EffectParams& params, int effect_num) { (_spell_manager->*_spell_effects[effect_num])(зачинщик, цели, параметры); } Так происходит в последней строке. Все, что я распечатываю, имеет значение, все указатели верны, вроде бы все в порядке, но (_spell_manager->*_spell_effects[effect_num])(instigator, Targets, Params); выбрасывает и исключение.
ЭТО необходимо, чтобы воссоздать проблему! Он запускается, но получает сообщение о нарушении прав доступа!
Данные CharacterData(ECharacterClass::BARBARIAN); PlayerCharacter* player = новый PlayerCharacter(data.GetCharacterData(), data.GetPlayerAttributeData()); SpellManagerspell_manager(игрок); Spell_manager.CreateSpell (игрок, SPELL_FIREBALL);
Я покажу свои классы, вырежу конструкторы и покажу, где нарушение прав доступа. Пожалуйста, помогите, должно работать.
Spell.cpp
#include "Spell.h" Spell* Spell::CreateSpell(ESpellID Spell_id) { CSpellData Spell_data (spell_id); вернуть новое заклинание (spell_data); } void Spell::InvokeEffect(Character* instigator, Vector Targets, EffectParams& params, int effect_num) { (_spell_manager->*_spell_effects[effect_num])(зачинщик, цели, параметры); } spell.h
#pragma один раз #include #include #include "CSpellData.h" использование пространства имен std; класс PlayerCharacter; класс EnemyCharacter; класс Персонаж; класс SpellManager; класс Заклинание { публика: используя Function = void(SpellManager::*)(Character*, вектор , EffectParams&); Spell(CSpellData& данные); статическое Spell* CreateSpell(ESpellID Spell_id); публика: void InvokeEffect(Character* instigator, цели вектора, EffectParams& params, int effect_num); публика: интервал _level; интервал _опыт; SpellManager* _spell_manager; CSpellData* _c_spell_data; вектор _spell_effects; } SpellManager.cpp (важная часть)
void SpellManager::CreateSpell(Character*spell_owner, ESpellIDspell_id) { Заклинание* заклинание = Spell::CreateSpell(spell_id); заклинание->_spell_manager = это; строка Spell_name = GameplayStatics::GetEnumString(spell_id); mapspell_instance; Spell_instance[spell_name] = заклинание; if (dynamic_cast(spell_owner) != nullptr) { _instanced_spells.push_back(spell_instance); } еще { _instanced_enemy_spells.push_back(spell_instance); } GameplayStatics::AddSpellToCharacter(spell_owner, заклинание); AddSpellEffects (заклинание); } void SpellManager::AddSpellEffects(Spell* заклинание) { заклинание->_spell_effects.push_back(&SpellManager::Fireball_Default); заклинание->_spell_effects.push_back(&SpellManager::Fireball_Level2); заклинание->_spell_effects.push_back(&SpellManager::Fireball_Level3); Данные о персонажах (ECharacterClass::BARBARIAN); PlayerCharacter* player = новый PlayerCharacter(data.GetCharacterData(), data.GetPlayerAttributeData()); ПерсонажДанные врага_данные (ECharacterClass::ENEMY); EnemyCharacter* враг = новый EnemyCharacter(enemy_data.GetCharacterData()); враг->имя = "ущелье"; вектор враги; враги.push_back(враг); Параметры EffectParams; заклинание->InvokeEffect(игрок, враги, параметры, 0); } и заклинания, которые я отталкиваю, имеют одинаковую подпись
void Fireball_Default(Символ* инициатор, векторные цели, EffectParams& параметры);
Здесь я беру указатель SpellManager
spell->_spell_manager = это;
и тут происходит нарушение прав доступа
spell->InvokeEffect(игрок, враги, параметры, 0); void Spell::InvokeEffect(Character* instigator, Vector Targets, EffectParams& params, int effect_num) { (_spell_manager->*_spell_effects[effect_num])(зачинщик, цели, параметры); } Так происходит в последней строке. Все, что я распечатываю, имеет значение, все указатели верны, вроде бы все в порядке, но (_spell_manager->*_spell_effects[effect_num])(instigator, Targets, Params); выбрасывает и исключение.
ЭТО необходимо, чтобы воссоздать проблему! Он запускается, но получает сообщение о нарушении прав доступа!
Данные CharacterData(ECharacterClass::BARBARIAN); PlayerCharacter* player = новый PlayerCharacter(data.GetCharacterData(), data.GetPlayerAttributeData()); SpellManagerspell_manager(игрок); Spell_manager.CreateSpell (игрок, SPELL_FIREBALL);
Мобильная версия