Вставка элементов в контейнеры копирует их.Поэтому вам следует связать копию, а не оригинал:
Card::addEffect(Effect fx)
{
effects.push_back(fx);
effects.back().parent = this;
}
В противном случае вы будете ссылаться на локальную переменную, которая выходит из области видимости при возврате addEffect
.
Обратите внимание, что этот кодгенерирует другую копию из-за передачи по значению.Давайте избавимся от этого:
Card::addEffect(Effect const& fx)
{
effects.push_back(fx);
effects.back().parent = this;
}
Также обратите внимание, что как только емкость исчерпана, вектор выполнит внутреннее перераспределение, и все указатели станут недействительными.Самый простой обходной путь - зарезервировать достаточно места с самого начала:
Card::Card()
{
effects.reserve(1000); // never more than 1000 effects at once
}
Если это неприемлемо для вас, вы должны либо использовать другой контейнер (std::list<Effect>
), либо поместить свои эффекты в кучу и управлять имивручную (std::vector<Effect*>
) или с помощью умного указателя (std::vector<boost::shared_ptr<Effect> >
).