Умные указатели и полиморфизм - использование в модельном классе вызывает проблемы с литьемC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Умные указатели и полиморфизм - использование в модельном классе вызывает проблемы с литьем

Сообщение Anonymous »

Я пытаюсь сделать игру в C ++, где кусочки будут перемещаться по игре. в том числе умные указатели. Но эта ржавость заставляет нас возникать некоторыми проблемами с полиморфизмом. Мы смотрим на C ++ 20, но мы еще не там, поэтому, хотя решения, связанные с ним, в порядке, как будущее, нам действительно нужен метод C ++ 17
по «перемещению игры», я имею в виду, что карты перемещаются в разные места в игре или в колоду/сброс, или токенс, вставленные на эти карты в игре. Мы моделируем Gameboard в памяти, используя выбор контейнеров, представляющих различные места в игре, такие как палубы, «в игре», рынок и т. Д. Различные зоны размещают разные карты с разными наборами возможностей, некоторые общие с другими типами, другие не < /p>
Рассмотрим следующую (срезанную) классовую диаграмму с некоторой многоучетной: < /p> < /> < /> .

Код: Выделить всё

GameInstance
- AbilityHealthInstance
- PlayerAvatarInstance
- MonsterCardInstance - multi inherit
- CardInstance
- MonsterCardInstance - multi inherit
- SpellCardInstance
- TokenInstance
В настоящее время мы используем unique_ptr для представления каждого экземпляра GameInstance , размещая их в разных коллекциях, чтобы представлять различные области в модели Gameboard, используя std :: move для перемещения из одного списка в другой. В Gameboard есть следующие области для каждого игрока:

[*] Deck - Список уникального_птра
[*] Discard - список уникального_птра
[*] Market - a Silp of Unique_ptr
[*] Market - a of hiply_ptr
[*] Market> /> avatar - единственный уникальный_Птр

[*] Поле - массив фиксированного размера уникального_птра
[*] Active - список уникального_пттра

Game Start Мы создаем колоды уникального_птра , но строим каждую карту в качестве соответствующего типа (монстр или заклинание). Рынок заполняется от колоды, чтобы игрок мог купить, здесь нет проблем, палуба и рынок - это одно и то же кардинс type
, однако возникают проблемы, когда мы пытаемся использовать Gameinstance Objects Polymorphical или пытаться и вывести тип. монстр, или активная область, если это заклинание. Но компилятор не позволит нам снять из уникального_птра на уникальный_ptr , как и если бы я использовал необработанные указатели и Dynamic_cast . Поэтому я не могу определить тип, и я не могу переместить экземпляр в коллекцию, которую он должен перейти, чтобы представить место на игровом доске < /p>
Ниже приведен абстрактный пример того, что я пытаюсь выполнить < /p>

Код: Выделить всё

bool BuyCard(size_t idx)
{
//find a free spot in the field and attempt to move the card there if it's a monster
auto newPos = std::find_if(Field.begin(), Field.end(), [&mktref, &index, iTargets](std::unique_ptr& fldref ) {
if (fldref == nullptr)
{
//unique_pointer_cast is some analoge for dynamic_cast in this instance
fldref = unique_pointer_cast(std::move(mktref));
return fldref == nullptr; //assume unique_pointer_cast would return null if cast impossible
}
index++;
return false;
});
if (newpos != Field.end())
{
return true; //buy monster worked
}
else
{
//wasn't a monster, put the card to the back of the active cards as we can assume it was a spell
Active.emplace_back(unique_pointer_cast(std::move(mktref));
return Active.back() != nullptr; //lets hope the buy spell worked
}
}
Аналогично возникает, если я попытаюсь использовать функциональность monstercardinstance и playeravatarinstance поделиться через ebilityHealthInstance . Как и в случае с необработанными указателями, я бы переключил либо объект в параметр функции, который примет указатель inbilityHealthInstance , чтобы нанести урон или оплату стоимости способности, в то время как я не могу казаться, когда я смотрю на уникальный_PTR или уникальныйbool DamageCard(unique_ptr target, size_t damage)
{
target->TakeDamage(damage)
if (target->isDead())
{ //move to discard}
}
//won't allow the following
DamageCard(PlayerAvatar, 5);
DamageCard(Field[3], 5);
< /code>
Что я ошибаюсь с использованием умных указателей здесь? Как я предполагаю, что я либо упускаю трюк, либо недоразумю их вариант использования

Подробнее здесь: https://stackoverflow.com/questions/796 ... ing-issues
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»