Сложная логика и конструктор не всегда хорошо сочетаются, и есть серьезные сторонники против выполнения тяжелой работы в конструкторе (с причинами).
Кардинальное правило заключается в том, что конструктор должен давать полностью пригодный для использования объект.
class Vector
{
public:
Vector(): mSize(10), mData(new int[mSize]) {}
private:
size_t mSize;
int mData[];
};
Это не означает полностью инициализированный объект, вы можете отложить некоторую инициализацию (подумайте ленивый), если пользователю не нужно об этом думать.
class Vector
{
public:
Vector(): mSize(0), mData(0) {}
// first call to access element should grab memory
private:
size_t mSize;
int mData[];
};
Если вам предстоит проделать большую работу, вы можете выбрать метод построения, который выполнит тяжелую работу перед вызовом конструктора. Например, представьте, что вы извлекаете настройки из базы данных и строите объект настроек.
// in the constructor
Setting::Setting()
{
// connect
// retrieve settings
// close connection (wait, you used RAII right ?)
// initialize object
}
// Builder method
Setting Setting::Build()
{
// connect
// retrieve settings
Setting setting;
// initialize object
return setting;
}
Этот метод построения полезен, если откладывание строительства объекта дает значительную выгоду. Например, если объекты занимают много памяти, откладывание получения памяти после задач, которые могут потерпеть неудачу, может быть плохой идеей.
Этот метод построителя подразумевает частный конструктор и публичный (или друга) построитель. Обратите внимание, что наличие конструктора Private накладывает ряд ограничений на использование класса, которое может быть сделано для класса (например, не может храниться в контейнерах STL), поэтому вам может потребоваться объединить другие шаблоны. Вот почему этот метод следует использовать только в исключительных случаях.
Возможно, вы захотите подумать и о том, как тестировать такие сущности, если вы зависите от внешней вещи (файла / БД), подумайте о внедрении зависимости, это действительно помогает при модульном тестировании.