Сокращение кода до абсолютно необходимого:
if (micsoda == 1)
{
Handball ujh;
hozzaad(uj, &ujh);
} // at this point in code, your object ujh runs out of scope!!!
Когда объект выходит из области видимости, он уничтожается (вы заметите, если добавите какой-либо оператор вывода в деструктор класса)..) и любые указатели на него становятся недействительными;особенно те, что в списке, становятся недействительными (кто-то говорит о висячих указателях - или ссылках, для которых может происходить то же самое).Теперь их использование приводит к неопределенному поведению - что означает, что может произойти что угодно .Если вам не повезло (или вам повезло, в зависимости от точки зрения), ваша программа даже дает сбой.
Имейте в виду, что из-за недостатка важных частей вашего кода я предполагаю, что вы храните только указатели на объекты в вашем классе ListaElem
, что весьма вероятно, поскольку хранимые классы полиморфны ...
Однако вам нужны объекты, живущие дольше, чем простопока программа находится в блоке if.Предполагая, что мы нацелены на некоторый реальный сценарий, просто переместить объекты из предложений if невозможно, поскольку нам может потребоваться более одного объекта одного типа.Таким образом, вы будете создавать объекты динамически.Однако тогда вам придется иметь дело с управлением памятью и вопросом владения.Проще всего справиться с управлением памятью с помощью умных указателей.Владение?Что ж, мне кажется разумным предположить, что список является единственным владельцем объектов, поэтому вы можете иметь:
class ListElem
{
std::unique_ptr<Team> m_data;
public:
ListElem(std::unique_ptr<Team> data) // accepting a unique_ptr already here indicates
// clearly that the item will grab ownership
: m_data(std::move(data)) // unique_ptr is only movable, not copiable!
{ }
}
Тогда вы можете изменить свой код выше на:
if (micsoda == 1)
{
int n, m; // sample data
hozzaad(uj, std::make_unique<Team>(n, m); // arguments are passed directly to
// the constructor of class Team
}
ОК, вы не можете использовать STL;тогда вы сами напишите свои умные указатели, а также шаблонные функции make_unique
и move
(как вы уже делали для списков и строк).На cppreference вы можете найти пример реализации, например, для std::make_unique
.Не просто скопируйте / вставьте код, но сначала поймите его, а лучше переписайте его с нуля, иначе вы ничего не будете изучать (то же самое относится и к моему коду выше).Или, может быть, вы спросите своего учителя, делает ли он / он исключение в STL для интеллектуальных указателей.
Последний совет: Работа с непрерывной памятью в целом намного быстрее, чем с памятью, потенциально распределенной по всей системной памяти.Таким образом, вы можете рассмотреть возможность повторной реализации std::vector
вместо std::list
.