Error handling
E.5
Позвольте конструктору установить инвариант и выбросить, если он не может
Причина
Оставление объекта без установленного инварианта - просить неприятностей. Не все функции-члены можно вызывать.
Пример
class Vector { // very simplified vector of doubles
// if elem != nullptr then elem points to sz doubles
public:
Vector() : elem{nullptr}, sz{0}{}
Vector(int s) : elem{new double[s]}, sz{s} { /* initialize elements */ }
~Vector() { delete [] elem; }
double& operator[](int s) { return elem[s]; }
// ...
private:
owner<double*> elem;
int sz;
};
Инвариант класса - здесь указанный как комментарий - установлен конструкторами. new выбрасывает, если не может выделить требуемую память. Операторы, в частности оператор индексации, полагаются на инвариант.
См. также: Если конструктор не может сконструировать корректный объект, выбросить исключение
Применение
Отметьте классы с приватным состоянием без конструктора (открытого, защищенного или приватного).