Ситуация. Есть базовый класс Actor, и есть наследники от него. Поля у них совпадают, только функции перезаписаны. Надо поля одного наследника присвоить полям другого(точнее передать 1 наследника конструктору другого). При этом некоторые поля инициализированы динамически. Соответственно конструктором копирования по умолчанию не обойтись, надо писать свой. Но есть 1 ассоциативный массив, члены которого инициализированы динамически. При этом члены массива это объекты типа BaseSpell*, а инициализируются они его потомками. Вот как всё выглядит: Actor.h
Код
class Actor { public: SpriteFile *sprite; SpriteFile *icon; SpriteFile *hpbar; SpriteFile *mpbar;
int hp; int full_hp; int mp; int max_mp; int full_mp; int training_points; int max_training_points; int protect; bool invulnerability; int poison_impact_factor; int poison_number_steps; bool click; bool standing;
for(auto it = a.spell_book.begin(); it != a.spell_book.end(); ++it) { this->spell_book[it->first] = ???; }
this->anim = a.anim; }
В двух словах, Enemy надо инициализировать через TestHero.
Добавлено (06.01.2014, 14:26) --------------------------------------------- В принципе проблему решил небольшим костылём. Просто сделал в Actor параметр name, в конструктор enemy передавал его, и там определял какого типа создавать объект. И enemy теперь не наследник, а просто содержит Actor* actor;
Добавлено (06.01.2014, 14:27) --------------------------------------------- Но всё равно интересно как бы можно было иначе её решить
Не нужно делать то, что мешает сделать тебе правильно. Чтобы не переопределять конструктор копирования и оператор присваивания для чистых указателей, лучше всего использовать std::shared_ptr. И затачивать класс под единичный конкретный объект тоже не стоит, чем отличается TestHero от Actor? Если только поведением и определенными спрайтами, то для конкретного объекта поведение можно реализовать через скрипты, вызывая из стека и использовать в Update для любого объекта, а спрайты объекту можно присвоить и за пределами его конструктора.
Сообщение отредактировал rozen777 - Четверг, 23 Января 2014, 03:30
Деструтор базового класса следует сделать виртуальным.
Для определения типа можно использовать ещё RTTI Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)