Ключевое слово static означает разные вещи в методе и в переменной. Для метода, как в примере, это означает, что он является глобальным классом, и вам не нужно иметь экземпляр класса для его вызова.
Чтобы создать новый объект динамически, вам нужно использовать новый, или «хитрость» заключается в назначении временного объекта для ссылки. назначение временного объекта точке не будет поддерживать этот объект в живых.
Таким образом, вы могли бы сделать следующее, но это обычно не делается, потому что вы часто хотели бы сохранить многие вещи, созданные на фабрике, и тогда вам пришлось бы копировать их, а не просто удерживать указатель в списке.
class PizzaFactory {
public:
static Pizza& create_pizza(const std::string& type) {
if (type == "Ham and Mushroom")
return HamAndMushroomPizza();
else if (type == "Hawaiian")
return HawaiianPizza();
else
return DeluxePizza();
}
};
const Pizza &one = create_pizza(""); // by ref
Pizza two = create_pizza(""); // copied
EDIT
Извините, ошибка в коде - добавлен недостающий const в ref.
Обычно временный объект длится только до конца полного выражения, в котором он появляется. Однако C ++ намеренно указывает, что привязка временного объекта к ссылке на const в стеке удлиняет время жизни временного объекта до времени жизни самой ссылки