Возможный дубликат:
Обнуляемые значения в C ++Как лучше всего представить обнуляемый член в C ++?
В C # мы можем использовать
Обнуляемый тип
. Такой тип данных очень необходим, поскольку не все может иметь осмысленное значение.Это настолько важный тип данных, что @Jon Skeet провел целую главу, охватывающую более 27 страниц, описывая толькоNullable
в своей выдающейся книге C # in Depth .Простым примером может быть
Person
класс 1 , определяемый как:struct Person { std::string Name; DateTime Birth; DateTime Death; //... };
Поскольку у человека всегда есть дата рождения, поэтому член
Birth
класс выше всегда будет иметь какое-то значимое значение. Но как насчетСмерти
? Какой должна быть ценность, если человек жив? В C # этот член может быть объявлен какNullable
2 , которому может быть присвоено значениеnull
, если человек жив.Как лучше всего решить эту проблему в C ++? На данный момент у меня есть только одно решение: объявить член как указатель :
DataTime *Death;
Теперь его значение может быть
nullptr
, когда человек жив. Но это заставляет использоватьновый
для мертвого человека, так как он будет иметь некоторую допустимую ценность. Это, в свою очередь, означает, что нельзя полагаться на копийно-семантический код по умолчанию , сгенерированный компилятором. Программист должен написать конструктор копирования, присваивание копии, деструктор, следуя правилу трех (C ++ 03), или в C ++ 11 правилу пяти .Итак, есть ли у нас лучшее и элегантное решение этой проблемы, чем просто сделать его указателем ?
1. Другие примеры включают таблицы реляционной базы данных, поскольку во многих СУБД столбцы могут иметь значение NULL.
2. Для этого также есть сокращение.Можно написать
DataTime?
, что точно то же самое, что иNullable
.