Лучший способ представить элемент, допускающий значение NULL, в C ++? [дубликат]

Возможный дубликат:
Обнуляемые значения в 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 .

32
задан Community 23 May 2017 в 12:32
поделиться