Другие языки программирования и технологии

Массив указателей в C++

Помогите разобраться, почему программа вылетает на массиве указателей?
В программе присутствует класс место, наследуемые классы животных.
Объект место - указатель на наследуемые объекты.
Место передается в функцию, для примитивной имитации жизни, где в определенный момент происходит сбой!
main.cpp
Стёпа Киселёв
Стёпа Киселёв
2 959
В твоей программе есть несколько неточностей и массив указателей здесь не причём.
1)Поговорим о логике программы. У тебя есть класс place.Вместо того, чтобы этот класс содержал массивы лис, кроликов и травы, ты животных наследуешь от места. Это не правильно. Лиса не может наследовать свойства полянки (площадь, диаметр ит. д) или какой-нибудь другой площадки. Здесь должна быть агрегация, а не наследование. То есть на полянке есть несколько лис, несколько кроликов и какое-то количество травы.
2)Допустим, ты скажешь, что ты не правильно придумал название. Ты имел ввиду не место, а элемент на месте (лиса, кролик или трава). Все они имеют общие черты и наследуют свойства этого элемента. Ты создал массив элементов базового класса, для поддержки полиморфизма. Это правильно. Но и в этом твоя выскакивающая ошибка. Присваивая указателю на элемент в массиве NULL при поедании травы или кролика, или смерти лисы, ты не удаляешь указатель из массива, он там и остаётся, но он NULL.В следующей проверке ты перебираешь массив и опрашиваешь getType().Но теперь твой NULL уже ни чего не знает getType(),по-этому программа вылетает.
Вот здесь присвоение NULL
for(int i=0; i < SIZE & & count; i ++)
if(obj[ i ]- > getType()==0)
{
obj[ i ]=NULL; //здесь нужно что то другое
count--;
}

А потом в другом месте кода в строке
if(obj[ i ]- > getType()==0)
ты для ob[ i ]==NULL,пытаешься вызвать getType().
Денис Дмитриев
Денис Дмитриев
9 759
Лучший ответ
Стёпа Киселёв спасибо за ответ!
1) Могу лишь сказать, насколько тупо поставлено условие, а оно, уж поверь, действительно глупо звучит, настолько и глупа реализация!
2)Да, в этом и была проблема, только на ночь глядя, что то совсем голова не соображала, только со временем понял и поставил проверку если obj==NULL, то continue!
Всё правильно. Могу предложить у каждого объекта завести всойство - жив/мёртв.
Тогда в момент смерти не указатель занулять, а выставлять признак.
А все действия производить только с теми животными, у которых признак = жив.