Я не знаю ни одного паттерна для решения этой конкретной проблемы. Это сложный вопрос дизайна, и он несколько уникален для таких языков, как C ++. Другая проблема заключается в том, что ответ на этот вопрос тесно связан с вашим индивидуальным (или корпоративным) стилем кодирования.
Я бы использовал указатели для этих членов, и когда они должны быть построены, выделяйте их одновременно. Вы можете использовать auto_ptr для них, и проверить NULL, чтобы увидеть, если они инициализированы. (Я думаю, что указатели - это встроенный «необязательный» тип в C / C ++ / Java, есть другие языки, где NULL не является допустимым указателем).
Одной из проблем, связанных со стилем, является то, что вы, возможно, полагаетесь на то, что ваши конструкторы выполняют слишком много работы. Когда я кодирую OO, я заставляю конструкторов выполнять достаточно работы, чтобы привести объект в согласованное состояние. Например, если у меня есть класс Image
и я хочу читать из файла, я мог бы сделать это:
image = new Image("unicorn.jpeg"); /* I'm not fond of this style */
или я мог бы сделать это:
image = new Image(); /* I like this better */
image->read("unicorn.jpeg");
Трудно рассуждать о том, как работает программа на C ++, если в конструкторах много кода, особенно если вы задаете вопрос: «Что произойдет, если конструктор потерпит неудачу?» Это главное преимущество перемещения кода из конструкторов.
Я бы хотел сказать больше, но я не знаю, что вы пытаетесь сделать с отложенным строительством.
Редактировать: Я вспомнил, что есть (несколько извращенный) способ вызвать конструктор объекта в любое произвольное время. Вот пример:
class Counter {
public:
Counter(int &cref) : c(cref) { }
void incr(int x) { c += x; }
private:
int &c;
};
void dontTryThisAtHome() {
int i = 0, j = 0;
Counter c(i); // Call constructor first time on c
c.incr(5); // now i = 5
new(&c) Counter(j); // Call the constructor AGAIN on c
c.incr(3); // now j = 3
}
Обратите внимание: если вы делаете что-то настолько безрассудное, то это может вызвать у вас презрение ваших коллег-программистов, если только у вас нет веских причин для использования этой техники. Это также не задерживает конструктор, просто позволяет вам вызвать его позже.