Среда, 25 Декабря 2024, 05:03

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Конструктор копирования и ассоциативный массив
goldsphereДата: Понедельник, 06 Января 2014, 14:27 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
Ситуация. Есть базовый класс Actor, и есть наследники от него. Поля у них совпадают, только функции перезаписаны. Надо поля одного наследника присвоить полям другого(точнее передать 1 наследника конструктору другого). При этом некоторые поля инициализированы динамически. Соответственно конструктором копирования по умолчанию не обойтись, надо писать свой. Но есть 1 ассоциативный массив, члены которого инициализированы динамически. При этом члены массива это объекты типа BaseSpell*, а инициализируются они его потомками.
Вот как всё выглядит:
Actor.h

Наследник 1(TestHero.h):

2 Наследник(Enemy.h):

Конструктор Actor

Конструктор TestHero

Конструктор копирования

В двух словах, Enemy надо инициализировать через TestHero.

Добавлено (06.01.2014, 14:26)
---------------------------------------------
В принципе проблему решил небольшим костылём. Просто сделал в Actor параметр name, в конструктор enemy передавал его, и там определял какого типа создавать объект. И enemy теперь не наследник, а просто содержит Actor* actor;

Добавлено (06.01.2014, 14:27)
---------------------------------------------
Но всё равно интересно как бы можно было иначе её решить


FinderX - Android Аркада
SanoraagДата: Среда, 22 Января 2014, 10:55 | Сообщение # 2
почетный гость
Сейчас нет на сайте
Приду домой отпишусь! есть у меня вариант

rozen777Дата: Среда, 22 Января 2014, 12:48 | Сообщение # 3
был не раз
Сейчас нет на сайте
Не нужно делать то, что мешает сделать тебе правильно.
Чтобы не переопределять конструктор копирования и оператор присваивания для чистых указателей, лучше всего использовать std::shared_ptr.
И затачивать класс под единичный конкретный объект тоже не стоит, чем отличается TestHero от Actor? Если только поведением и определенными спрайтами, то для конкретного объекта поведение можно реализовать через скрипты, вызывая из стека и использовать в Update для любого объекта, а спрайты объекту можно присвоить и за пределами его конструктора.


Сообщение отредактировал rozen777 - Четверг, 23 Января 2014, 03:30
OpenGOOДата: Среда, 22 Января 2014, 14:25 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
Деструтор базового класса следует сделать виртуальным.

Для определения типа можно использовать ещё RTTI


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг