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