Я использую именованную конструкторскую идиому для создания объектов, потому что у меня много вызовов с одинаковыми параметрами, но объект должен быть создан по-разному.
С++ FAQ расскажите, как это сделать. Он также сообщает нам, как принудительно распределять объекты, находящиеся в куче. Тем не менее, это действительно не позволяет нам сказать, как использовать именованную конструкторскую идиому с новым оператором.
Поскольку new требует вызова конструктора, мы не можем напрямую вызывать именованные конструкторы. Поэтому я нашел две обходные пути для этой проблемы:
Я создаю дополнительный конструктор копий и надеюсь, что оптимизация компиляторов не создаст временного объекта.
class point_t {
int X,Y;
point_t(int x, int y) : X(x), Y(y) { }
public:
point_t(const point_t &x) : X(x.X), Y(x.Y) { }
static point_t carthesian(int x, int y) { return point_t(x,y); }
static point_t polar(float radius, float angle) {
return point_t(radius*std::cos(angle), radius*std::sin(angle));
}
void add(int x, int y) { X += x; Y += y; }
};
int main(int argc, char **argv) {
/* XXX: hope that compiler doesn't create a temporary */
point_t *x = new point_t(point_t::carthesian(1,2));
x->add(1,2);
}
Другая версия - создавать отдельные именованные конструкторы. Поскольку перегрузка функций не работает с типом возврата, я использую два разных имени, что является уродливым.
class point_t {
int X,Y;
point_t(int x, int y) : X(x), Y(y) { }
public:
/* XXX: function overloading doesn't work on return types */
static point_t carthesian(int x, int y) { return point_t(x,y); }
static point_t *carthesian_heap(int x, int y) { return new point_t(x,y); }
void add(int x, int y) { X += x; Y += y; }
};
int main(int argc, char **argv) {
point_t *x = point_t::carthesian_heap(1,2);
x->add(1,2);
}
Есть ли более красивая версия, которая равна примерному коду?