Идиома Named Constructor — это паттерн проектирования в C++, который обеспечивает более интуитивное и безопасное создание объектов благодаря использованию публичных статических методов вместо опоры исключительно на перегрузку конструкторов.
Конструкторы всегда имеют имя класса, поэтому различие между несколькими конструкторами зависит только от их списков параметров. Когда существует много конструкторов с похожими параметрами, это создаёт неоднозначность и потенциальные ошибки.
Например, класс Point может принимать координаты двумя способами:
Оба требуют два float'а, создавая неоднозначность при перегрузке:
class Point {
public:
Point(float x, float y); // Декартовы?
Point(float r, float a); // Полярные?
// ОШИБКА: Неоднозначный конструктор
};
Point p = Point(5.7, 1.2); // Какая система?
Перенеси все конструкторы в раздел private (или protected для наследования) и предоставь публичные статические методы, которые возвращают объекты:
class Point {
public:
static Point rectangular(float x, float y);
static Point polar(float radius, float angle);
private:
Point(float x, float y);
float x_, y_;
};
inline Point Point::rectangular(float x, float y) {
return Point(x, y);
}
inline Point Point::polar(float radius, float angle) {
return Point(radius*cos(angle), radius*sin(angle));
}
Статические методы обеспечивают понятный, самодокументирующийся код:
Point p1 = Point::rectangular(5.7, 1.2); // Очевидное намерение
Point p2 = Point::polar(5.7, 1.2); // Очевидное намерение
protectedNamed Constructor Idiom перемещает конструкторы в секцию private и предоставляет публичные статические методы для создания объектов, устраняя ambiguity при перегрузке конструкторов на основе параметров благодаря описательным именам методов.
Новый — ещё не проверен сообществом
Вы