Построить заводскую функцию. Это статические функции-члены или автономные функции, которые также создают объекты, обычно после проверки входных данных. Они полезны всякий раз, когда вы хотите убедиться, что ваши объекты не могут быть построены с неверным вводом (в конце концов, вы не можете прервать построение внутри ctor).
Поскольку фабрика - это обычная функция, вы можете легко связать ее, чтобы получить тот же эффект, который вам нужен - связанную функцию, которая создает объекты.
class X
{
public:
X(OtherObject a, OtherData data);
virtual ~X() {}
};
// Factory- return "X" instead of "X*" if not using the heap
X* CreateX(OtherObject a, OtherData data) {
/*
Logic that checks a, data for validity...
*/
if(invalid) {
return 0; // You get no object
}
return new X();
}
Теперь вы просто привязываетесь к «CreateX» для создания объектов. Однако это обычная функция, а не конструктор, поэтому применяются все нормальные правила для функций, особенно правила копирования и перемещения объектов.