Объявил переменную классового типа, не создал экземпляр... однако проверка на пустоту не проходит
Всем привет, я новичок в С++, помогите пожалуйста с одной проблемой. У меня есть класс (например class Human) и я объявляю переменную типа этого класса, однако не создаю его экземпляр (объект) сразу. Это происходит в рандомный момент. Так же я знаю, что если ссылка не указывает на объект, и попытаться как-то с ней провзаимодействовать, это может привести к ошибке и вылету программы. Ставлю проверку на пустоту - она всё равно не срабатывает ((... вот примерно так это и выглядит:
class Human {
int health = 90;
bool isAlive() { return this->health > 0; }
};
int main () {
Human* _man; // объявлен, но не создан
while(true) {
if(/*если нажата клавиша*/)
_man = new Human();
if(_man) {// проверка на "не пустоту"
if(_man->isAlive()) {
....//какое-то действие над человеком
}
}
if(/*если нажата другая клавиша*/)
break;
}
}
В if с проверкой на "не пустоту" я что только не ставил... И просто имя переменной подставлял, как на примере, и if(_man != nullptr), и if(_man != NULL)... и ни что не помогло, все равно валиться на этом... единственное что помогает - сразу объявлять переменную с nullptr... Human* _man = nullptr; Оно конечно не сложно, но есть ли какие-то способы и без значения какого либо отслеживать? Заранее благодарен.
Ответы (2 шт):
Ваше
Human* _man; // объявлен, но не создан
означает, что в _man хранится какое-то мусорное значение, указатель на какое-то случайное место в памяти. Отсюда и все ваши неприятности.
Неужели = nullptr такая большая цена за отсутствие ошибки?
И неужели компилятор не выдавал вам предупреждения об использовании потенциально неинициализированной переменной?
единственное что помогает - сразу объявлять переменную с nullptr... Human* _man = nullptr; Оно конечно не сложно
Это единственный способ, грубо говоря, для POD типов нет конструкторов по умолчанию, и автоматические переменные не инициализированы.
но есть ли какие-то способы и без значения какого либо отслеживать?
Как вариант, использовать "умные" указатели unique_ptr, shared_ptr, ...:
...{
std::unique_ptr<Human> _man; // объявлен, но не создан
...
// Создаём уникальный указатель на новый Human с конструктором без аргументов
_man = std::make_unique<Human>();
...
if (_man)
...
...}
// Если у _man указатель не изъяли, то удаляем Human при выходе из области видимости
Но они недаром умные, они умничают. Но, возможно, так как Вам в данном месте надо умничают?